這是示例文本:
abc_fgh
abc_edg_pkl
abc_plc
abc_action
there are some other texts in the file
not at begin abc_action
abc_nmp
如何替換以abc_to開頭的文本efg_,并且 abc_action不應該修改?
也就是說,對于上面的示例文本,輸出應該是:
efg_fgh
efg_edg_pkl
efg_plc
abc_action
there are some other texts in the file
not at begin abc_action
efg_nmp
每個以開頭的單詞abc_都沒有意義abc_action,除了不應修改。
每個以abc_except開頭abc_action的單詞都應修改為以efg_開頭的單詞。
我不能保證那abc_是在行的開頭。
如何通過sed或其他命令實作這一目標?
uj5u.com熱心網友回復:
sed '/^abc_action$/!s/^abc_/efg_/'
這意味著 * 在不包含abc_actions其他內容的行上,將前導替換abc_為efg_.
uj5u.com熱心網友回復:
- 如果您不想修改該行
abc_action:
sed '/abc_action/!s/\([ ]\ \)abc_\|^abc_/\1efg_/g' filename
- 如果要修改帶有 的行
abc_action,有一個技巧可以更改 為不會替換模式abc_action的特殊單詞或符號(此處為) ,然后修改模式并恢復最后一個。#abc_abc_abc_action
sed 's/abc_action/#/g' filename | sed 's/\([ ]\ \)abc_\|^abc_/\1efg_/g' | sed 's/#/abc_action/g'
解釋:
1, /abc_action/!:sed不會處理包含abc_action.
2, s/regexp/replacement/g: 全部替換regexp到replacement每一行。
3, : 將把以或 開頭s/\([ ]\ \)abc_\|^abc_/\1efg_/g的單詞替換為to 。我猜想不在行首的單詞應該被一個或多個空格分隔。 abc_abc_efg_
4 \([ ]\ \)、:一個或多個空格模式。
5 \1、:將復制結果中空格的模式得到。
uj5u.com熱心網友回復:
Perl 解決方案:
perl -lpe 's{abc_(?!action)}{efg_}g; ' in_file > out_file
Perl 單行器使用這些命令列標志:
-e:告訴 Perl 查找行內代碼,而不是在檔案中。
-p:一次回圈輸入一行,$_默認情況下將其分配給。print $_在每次回圈迭代后添加。
-l: 在執行行內代碼之前去除輸入行分隔符("\n"默認情況下在 *NIX 上),并在列印時附加它。
(?!action): 負前瞻。這意味著以下字串無法匹配action。
正則運算式使用這些修飾符:
/g: 重復匹配模式。
還請參見
perldoc perlrun::如何執行 Perl 解釋器:命令列開關
perldoc perlre:Perl 正則運算式(正則運算式)
perldoc perlre:Perl 正則運算式(正則運算式):量詞;字符類和其他特殊轉義;斷言;捕獲組
perldoc perlrequick:Perl 正則運算式快速入門
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/473086.html
