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之前,"只有在每一行的第一个找到的字符串。
另一种方法:
$ 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)
要sed重复替换一行中的所有匹配项,请g在最后一个 之后添加标志/:
$ sed 's/[^"]*blah/N&/g' test.txt
Run Code Online (Sandbox Code Playgroud)
该g标志将导致“对正则表达式的所有非重叠匹配项进行替换,而不仅仅是第一个”(引用自我系统上的手册)。
我还稍微更改了正则表达式,以便匹配"之前blah不匹配的所有字符。这样,替换将N在第一个数字之前插入,就在".