正则表达式添加缺少的引号

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/

Kus*_*nda 8

如果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末尾的标志。