我正在尝试在文本文件中某些行的末尾添加缺少的引号。
我发现正则表达式 [^\"]$ 足以找到缺少终端双引号的行,因此使用反向引用尝试了以下替换(我以前从未使用过)。在“捕获组”周围使用括号我希望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
(现在它的 char 16 令人反感)。反向引用如何进行? https://xkcd.com/1171/
如果
sed
不使用-E
,则表达式是基本正则表达式,并且捕获组必须写为\(...\)
。当您使用-E
启用扩展正则表达式时,捕获组被写入(...)
.内部是文字,因此您的表达式也将避免
\
在以 .[...]
结尾的行上添加双引号\
。其他一些转义也是不必要的。因此,您可以将
sed
命令编写为或作为
或者,使用
&
:表达式的
&
替换部分将替换为匹配正则表达式的输入部分。其他几个不使用捕获组的替代方案:
这适用
s/$/"/
于所有匹配的行/[^"]$/
。或者,或者,
这适用
s/$/"/
于所有不匹配的行/"$/
(与此处的其他方法略有不同,它也将 a 添加"
到空行)。请注意,在所有情况下,绝对不需要
g
最后的标志。试试
sed -e 's|\([^\"]$\)|\1\"|g' bigfile.tsv
。