Sed 查找两个字符模式,仅替换一个字符

Sed 查找两个字符模式,仅替换一个字符,sed,substitution,Sed,Substitution,在下面的数据中,我想用~替换所有没有紧跟空格的逗号。因此,“美国总统(1995)”中的逗号将保留,因为后面紧跟着空格 10,GoldenEye (1995),Action|Adventure|Thriller 11,"American President, The (1995)",Comedy|Drama|Romance 以下是我想要的输出: 10~GoldenEye (1995)~Action|Adventure|Thriller 11~"American President, Th

在下面的数据中,我想用
~
替换所有没有紧跟空格的逗号。因此,“美国总统(1995)”中的逗号将保留,因为后面紧跟着空格

10,GoldenEye (1995),Action|Adventure|Thriller  
11,"American President, The (1995)",Comedy|Drama|Romance
以下是我想要的输出:

10~GoldenEye (1995)~Action|Adventure|Thriller  
11~"American President, The (1995)"~Comedy|Drama|Romance
我已经尝试了下面的代码,但这将替换两个字符,而不仅仅是第一个字符

sed 's/,[^ ]/~/g' file.csv 
我得到的结果如下:

10~oldenEye (1995)~ction|Adventure|Thriller  
11~American President, The (1995)"~omedy|Drama|Romance
请尝试使用sed's/,\([^\t]\)/~\1/g'file.csv
这将为您提供请求的输出。
请注意,这不会替换后面的逗号,因此从技术上讲,这只是部分解决方案。
我知道塞德能完全按照你的要求做,但我不知道怎么做。
如果你不需要转换尾随的逗号,那也没关系

它的作用是查找
,[^\t]
,它是一个逗号,后跟一个不是空格或制表符的字符。
“\(
\)
可用于“记住”匹配的内容,然后由第一组
“\(…\)
匹配的值可被引用为
\1
。第二组可以引用为\2等。

尝试
sed的/,\([^\t]\)/~\1/g'file.csv

这将为您提供请求的输出。
请注意,这不会替换后面的逗号,因此从技术上讲,这只是部分解决方案。
我知道塞德能完全按照你的要求做,但我不知道怎么做。
如果你不需要转换尾随的逗号,那也没关系

它的作用是查找
,[^\t]
,它是一个逗号,后跟一个不是空格或制表符的字符。
“\(
\)
可用于“记住”匹配的内容,然后由第一组
“\(…\)
匹配的值可被引用为
\1
。第二组可以引用为\2等。

这可能适合您(GNU-sed):

这将替换所有的
,后跟一个非空格字符或文件结尾

注意:替换分为两种可能的过程,包括相邻的
,这可能对您有用(GNU-sed):

这将替换所有的
,后跟一个非空格字符或文件结尾


注意:替换分为两个可能的过程,包括相邻的
,,如果您从来没有两个连续的逗号,这将起作用:

$ sed -r 's/,([^[:blank:]]|$)/~\1/g' file
10~GoldenEye (1995)~Action|Adventure|Thriller
11~"American President, The (1995)"~Comedy|Drama|Romance
$ echo 'a,,b' | sed -r 's/,([^[:blank:]]|$)/~\1/g'
a~,b

$ echo 'a,,b' | awk '{$0=gensub(/,(\S|$)/,"~\\1","g")}1'
a~,b

$ echo 'a,,b' | awk '{ while( $0!=($0=gensub(/,(\S|$)/,"~\\1","g")) ); }1'
a~~b
或:

如果您可以有多个连续的逗号,那么我将坚持使用awk:

$ awk '{ while( $0!=($0=gensub(/,(\S|$)/,"~\\1","g")) ); }1' file
10~GoldenEye (1995)~Action|Adventure|Thriller
11~"American President, The (1995)"~Comedy|Drama|Romance
以下是两种方法在使用连续逗号时的情况:

$ sed -r 's/,([^[:blank:]]|$)/~\1/g' file
10~GoldenEye (1995)~Action|Adventure|Thriller
11~"American President, The (1995)"~Comedy|Drama|Romance
$ echo 'a,,b' | sed -r 's/,([^[:blank:]]|$)/~\1/g'
a~,b

$ echo 'a,,b' | awk '{$0=gensub(/,(\S|$)/,"~\\1","g")}1'
a~,b

$ echo 'a,,b' | awk '{ while( $0!=($0=gensub(/,(\S|$)/,"~\\1","g")) ); }1'
a~~b
上面使用GNU awk表示
gensub()
,因此我也使用了
\S
而不是
[^[:blank]]
,因为解决方案需要GNU awk,所以也使用
\S
本身不会牺牲可移植性。如果使用GNU sed,它还将支持
\S
,而不是
[^[:blank:]
,idk关于其他sed的信息。对于其他AWK,它将是:

awk '{ while( i=match($0,/,([^[:blank:]]|$)/) ) $0=substr($0,1,i-1)"~"substr($0,i+1) } 1'

如果您从未使用过两个连续的逗号,则此选项将起作用:

$ sed -r 's/,([^[:blank:]]|$)/~\1/g' file
10~GoldenEye (1995)~Action|Adventure|Thriller
11~"American President, The (1995)"~Comedy|Drama|Romance
$ echo 'a,,b' | sed -r 's/,([^[:blank:]]|$)/~\1/g'
a~,b

$ echo 'a,,b' | awk '{$0=gensub(/,(\S|$)/,"~\\1","g")}1'
a~,b

$ echo 'a,,b' | awk '{ while( $0!=($0=gensub(/,(\S|$)/,"~\\1","g")) ); }1'
a~~b
或:

如果您可以有多个连续的逗号,那么我将坚持使用awk:

$ awk '{ while( $0!=($0=gensub(/,(\S|$)/,"~\\1","g")) ); }1' file
10~GoldenEye (1995)~Action|Adventure|Thriller
11~"American President, The (1995)"~Comedy|Drama|Romance
以下是两种方法在使用连续逗号时的情况:

$ sed -r 's/,([^[:blank:]]|$)/~\1/g' file
10~GoldenEye (1995)~Action|Adventure|Thriller
11~"American President, The (1995)"~Comedy|Drama|Romance
$ echo 'a,,b' | sed -r 's/,([^[:blank:]]|$)/~\1/g'
a~,b

$ echo 'a,,b' | awk '{$0=gensub(/,(\S|$)/,"~\\1","g")}1'
a~,b

$ echo 'a,,b' | awk '{ while( $0!=($0=gensub(/,(\S|$)/,"~\\1","g")) ); }1'
a~~b
上面使用GNU awk表示
gensub()
,因此我也使用了
\S
而不是
[^[:blank]]
,因为解决方案需要GNU awk,所以也使用
\S
本身不会牺牲可移植性。如果使用GNU sed,它还将支持
\S
,而不是
[^[:blank:]
,idk关于其他sed的信息。对于其他AWK,它将是:

awk '{ while( i=match($0,/,([^[:blank:]]|$)/) ) $0=substr($0,1,i-1)"~"substr($0,i+1) } 1'

第一个gsub替换第一行上的逗号,下面两个子项更改第二行上的第一个和最后一个逗号

awk 'NR<2{gsub(/,/,"~")}{sub(/1,/,"1~")}{sub(/,C/,"~C")}1' file
10~GoldenEye (1995)~Action|Adventure|Thriller 
11~"American President, The (1995)"~Comedy|Drama|Romance

awk'NR第一个gsub替换第一行的逗号,下面两个子项更改第二行的第一个和最后一个逗号

awk 'NR<2{gsub(/,/,"~")}{sub(/1,/,"1~")}{sub(/,C/,"~C")}1' file
10~GoldenEye (1995)~Action|Adventure|Thriller 
11~"American President, The (1995)"~Comedy|Drama|Romance
awk'NR