这个命令:
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/"
因为似乎没有特别的理由使用非标准正则表达式分隔符。