jer*_*man 3 sed regular-expression
我试图在文本文件中的某些行的末尾添加缺少的引号。
我发现正则表达式 [^\"]$ 足以找到缺少终端双引号的行,因此尝试使用反向引用进行以下替换(我以前从未使用过)。我希望在“捕获组”周围使用括号sed 将允许反向引用该组,但
sed 's|([^\"]$)|\1\"|g' bigfile.tsv
Run Code Online (Sandbox Code Playgroud)
命中
sed: -e expression #1, char 17: invalid reference \1 on `s' command's RHS
Run Code Online (Sandbox Code Playgroud)
如果我不转义替换引号,则相同
sed 's|([^\"]$)|\1"|g' bigfile.tsv
Run Code Online (Sandbox Code Playgroud)
(现在它的字符 16 令人反感)。反向引用如何进行? https://xkcd.com/1171/
如果sed不使用-E,则表达式是一个基本的正则表达式,捕获组必须写为\(...\). 当您使用-E启用扩展正则表达式时,捕获组被写入(...)。
在\里面[...]是文字,那么你的表达也会避免增加与结束行双引号\。一些其他的转义也是不必要的。
因此,您可以将sed命令写为
sed 's/\([^"]\)$/\1"/'
Run Code Online (Sandbox Code Playgroud)
或作为
sed -E 's/([^"])$/\1"/'
Run Code Online (Sandbox Code Playgroud)
或者,使用&:
sed 's/[^"]$/&"/'
Run Code Online (Sandbox Code Playgroud)
该&表达式中的替换部分将由匹配正则表达式的输入的部分被取代。
其他几个不使用捕获组的替代方案:
sed '/[^"]$/ s/$/"/'
Run Code Online (Sandbox Code Playgroud)
这适用s/$/"/于所有匹配的行/[^"]$/。
或者,或者,
sed '/"$/ !s/$/"/'
Run Code Online (Sandbox Code Playgroud)
这适用s/$/"/于所有不匹配的行/"$/(与此处的其他方法略有不同,因为它还"向空行添加了 a )。
请注意,在所有情况下,绝对不需要g末尾的标志。