使用sed在匹配字符串的第n个位置添加字符

Min*_*kas 5 sed text-processing

我需要在匹配字符串的第 n 个位置(在本例中为第 2 个)添加一个字符。例如,在一个文件text.txt,我想在字符串之前和之后加入一个N"只包含字符串blah

文本.txt:

"1blah8","na","8blah4"  
"2blah5","na","10blah4"  
"5blah5","na","1blah234"  
Run Code Online (Sandbox Code Playgroud)

我想得到一个 text2.txt:

"?1blah8","na","?8blah4"  
"?2blah5","na","?10blah4"  
"?5blah5","na","?1blah234"  
Run Code Online (Sandbox Code Playgroud)

我已经试过sed 's/.*blah.*/N&/' text.txt > text2.txt ,但我一开始N之前,"只有在每一行的第一个找到的字符串。

ter*_*don 7

另一种方法:

$ sed 's/"\([^"]*blah[^"]*"\)/"N\1/g' test.txt 
"N1blah8","na","N8blah4"  
"N2blah5","na","N10blah4"  
"N5blah5","na","1blah234
Run Code Online (Sandbox Code Playgroud)

正则表达式是寻找一个",然后0或多个非"字符,随后是blah,然后然后0或多个非"试。由于括号的原因,它被捕获,以后可以称为\1。因此,该命令将用自身 ( \1)替换匹配的模式,但"N附加了一个。这就是为什么第一个"在括号之外。/g末尾的修饰符使其替换每一行中的所有匹配字符串。

如果您的sed版本支持它,您可以将其简化为:

sed -E 's/"([^"]*blah[^"]*")/"N\1/g'
Run Code Online (Sandbox Code Playgroud)


Kus*_*nda 5

要sed重复替换一行中的所有匹配项,请g在最后一个 之后添加标志/:

$ sed 's/[^"]*blah/N&/g' test.txt
Run Code Online (Sandbox Code Playgroud)

该g标志将导致“对正则表达式的所有非重叠匹配项进行替换,而不仅仅是第一个”(引用自我系统上的手册)。

我还稍微更改了正则表达式,以便匹配"之前blah不匹配的所有字符。这样,替换将N在第一个数字之前插入,就在".