我正在尝试在文本文件中某些行的末尾添加缺失的引号。
我发现正则表达式 [^\"]$ 足以查找缺少终端双引号的行,因此尝试使用反向引用进行以下替换(老实说我以前从未使用过)。在“捕获组”周围使用括号我希望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
。