1

在一个文本文件中,我想注释掉这些行:

<whatever>xyz
<whatever>xyz <whatever>

...这是一个特定的字符串,后跟行尾或空格。

但我想不理会这些行:

<whatever>xyz<something><whatever>

...那是字符串后跟一个不是空格的字符。

以下当然不是文字字符串:

  • <whatever> 零个或多个可能是空格的字符。
  • <something> 除了空白之外的任何东西。

我试过这个:

sed -e '/xyz[ $]/s/^/# /g' in.txt > out.txt

...但它与字符串后立即带有行尾的行不匹配。似乎 $ 符号在方括号内时被视为文字。


这是我目前的黑客:

sed -e '/xyz /s/^/# /g' in.txt > out.txt
sed -e '/xyz$/s/^/# /g' -i out.txt

...但由于速度原因,我宁愿只解析文件一次。我也想匹配 \t 以及普通的空格字符;但这不是强制性的。

对于这个输入文件,“in.txt”:

xyz
xyz #
xyz.

我正在运行 Linux Mint,即 gnu sed。

4

2 回答 2

2

特殊字符在括号表达式中失去意义。

尝试这个:

sed -Ee '/(xyz$)|(xyz )|(xyz\t)/s/^/# /g'

> gsed -Ee '/(xyz$)|(xyz )|(xyz)\t/s/^/# /g' in.txt
# xyz
# xyz #
xyz.
于 2018-02-07T13:50:41.300 回答
0
$ cat r.sh 
awk '{
   a = $0 ~ /xyz/
   b = $0 ~ /xyz[^ \t]/
   if (a && !b) print "# " $0
   else         print $0
 }' "$@"

用法

sh r.sh file
于 2018-02-07T13:19:11.170 回答