在 bash 脚本中使用 perl 删除一行

在 bash 脚本中使用 perl 删除一行

这个命令:

sed -i "\|^pref\.fullscreen\.toolbarPixels|d" ~/.vmware/preferences

作品。
但是这个命令:

perl -pi -e "\|^pref\.fullscreen\.toolbarPixels|d" ~/.vmware/preferences

给我输出:

Backslash found where operator expected at -e line 1, near "pref\"
Backslash found where operator expected at -e line 1, near "fullscreen\"
syntax error at -e line 1, near "\|"
Execution of -e aborted due to compilation errors.

为什么?

更新:

test.txt 文件包含:

melon
banana
peach
apple

这个命令:

perl -ni -e "print unless m|apple|; print unless m|banana|" test.txt

返回:

melon
melon
banana
peach
peach
apple

代替:

melon
peach

为什么?

答案1

对于苹果/香蕉问题,会出现重复项,因为这两个语句都作用于文件中的行。由于没有语句过滤器melon或者peach它们是重复的。

以下方法可以防止重复并实现所需的删除:

$ perl -ni -e "print unless m/(apple|banana)/" test.txt

另一种将可变性移出正则表达式的方法:

$ perl -ni -e "print unless m/apple/ or m/banana/" test.txt

答案2

Perl 并不是 sed 的直接替代品——它恰好支持类似的s/pattern/replacement/语法,但这并不意味着其他 sed 命令也可以工作。

你可以这样做

perl -ni -e "print unless m|^pref\.fullscreen\.toolbarPixels|"

我想,或者只是

perl -ni -e "print unless /^pref\.fullscreen\.toolbarPixels/"

因为似乎没有特别的理由使用非标准正则表达式分隔符。

相关内容