带有字符串的注释行可能后跟空格/制表符

时间:2018-02-07 10:50:19

标签: sed text-files whitespace end-of-line

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

<whatever>xyz
<whatever>xyz <whatever>

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

但我想单独留下这些界限:

<whatever>xyz<something><whatever>

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

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

  • &LT;什么&gt;零个或多个可能是空格的字符。
  • &LT;的东西&gt;除了白色空间以外的任何东西。

我试过这个:

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和普通的空间角色;但这不是强制性的。

对于此输入文件,&#34; in.txt&#34;:

xyz
xyz #
xyz.

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

2 个答案:

答案 0 :(得分:2)

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

试试这个:

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

> gsed -Ee '/(xyz$)|(xyz )|(xyz)\t/s/^/# /g' in.txt
# xyz
# xyz #
xyz.

答案 1 :(得分:0)

$ cat r.sh 
awk '{
   a = $0 ~ /xyz/
   b = $0 ~ /xyz[^ \t]/
   if (a && !b) print "# " $0
   else         print $0
 }' "$@"

用法

sh r.sh file