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

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

我正在尝试在文本文件中某些行的末尾添加缺失的引号。

我发现正则表达式 [^\"]$ 足以查找缺少终端双引号的行,因此尝试使用反向引用进行以下替换(老实说我以前从未使用过)。在“捕获组”周围使用括号我希望sed 将允许反向引用该组,但是

sed  's|([^\"]$)|\1\"|g' bigfile.tsv

点击数

sed: -e expression #1, char 17: invalid reference \1 on `s' command's RHS

如果我不转义替换引号,则相同

sed  's|([^\"]$)|\1"|g' bigfile.tsv

(现在它的字符 16 是令人反感的)。反向引用如何进行? https://xkcd.com/1171/

答案1

sed当您在没有 的情况下运行时-E,表达式是基本正则表达式,并且捕获组必须写为\(...\).当您使用-E启用扩展正则表达式时,将写入捕获组(...)

内部是文字,因此您的表达式也将避免在以 结尾\[...]行上添加双引号\。其他一些转义也是不必要的。

因此,您可以将sed命令写为

sed 's/\([^"]\)$/\1"/'

或作为

sed -E 's/([^"])$/\1"/'

或者,使用&

sed 's/[^"]$/&"/'

表达式的替换部分&将被替换为与正则表达式匹配的输入部分。

其他一些不使用捕获组的替代方案:

sed '/[^"]$/ s/$/"/'

这适用s/$/"/于所有匹配的行/[^"]$/

或者,或者,

sed '/"$/ !s/$/"/'

这适用s/$/"/于所有不匹配的行/"$/(与此处的其他方法略有不同,因为它还"向空行添加了 a)。

请注意,在所有情况下,g末尾的标志都是确实不需要。

答案2

尝试sed -e 's|\([^\"]$\)|\1\"|g' bigfile.tsv

相关内容