我正在尝试使用perl one liner替换文件中第一次出现的模式。
>touch tmp
>perl -p -i.bak -e '++$seen if( !$seen && s/alpha/beta/);' tmp
然后按Enter键。屏幕上显示以下信息。
perl -p -i.bak -e '++$seen if( tmpseen && s/alpha/beta/);' tmp
请注意,!$seen
已替换为tmpseen
。
为什么会这样?
感谢。
答案 0 :(得分:4)
正如kjprice所提到的!$由shell扩展。一种可能的解决方案是使用运算符'not'而不是运算符!。
perl -p -i.bak -e '++$seen if( (not $seen) && s/alpha/beta/);' tmp
由于运算符'not'
的优先级较低,因此存在括号答案 1 :(得分:3)
您可以使用\
转义任何csh特殊字符:
perl -p -i.bak -e '++$seen if( \!$seen && s/alpha/beta/);' tmp