檔案sed.txt中的原行:
outer_string_PATTERN_string(PATTERN_And_PATTERN_i)PATTERN_outer_string(i_PATTERN_inner)_outer_string
只需要將PATTERN替換為pattern,其中的括號中沒有小寫,它可以替換為其他單詞。
預期結果:
outer_string_PATTERN_string(pattern_And_pattern_i)PATTERN_outer_string(i_pattern_inner)_outer_string
我可以使用([^)]*)模式來找到子串,這將是替換一些世界的。但是我不能用這個模式來索引子串的位置,而且它將把整行的PATTERN替換成pattern。
:/tmp$ sed 's/([^)]*)/--/g' sed.txt
outer_string_PATTERN_string---PATTERN_outer_string---_outer_string
:/tmp$ sed '/([^]*)/s/PATTERN/pattern/g'/span> sed.txt
outer_string_pattern_string(pattern_And_pattern_i) pattern_outer_string(i_pattern_inner)_outer_string
我還試著用sed中的regex組來捕捉和替換這些詞,但我搞不清楚這個命令。
sed可以實作嗎?以及如何實作?THX.
uj5u.com熱心網友回復:
sed可以實作嗎?
是的,但你不要在sed中做。請使用其他編程語言,如Python、Perl或awk。
如何實作這一點?在
sed中,實作非貪婪的regex并不簡單。基本上,一般來說,它包括:
- 提取大塊的資料。
- 獲取輸入的大塊內容
處理該塊內容將其放入保持空間。- 用pattern space洗刷hold--提取已經處理過的,沒有處理過的
。- 重復處理
。- 用保持空間進行洗牌
。- 輸出
無論如何,以下腳本:
#!/bin/bash sed <<<'outer_string_PATTERN_string(PATTERN_i_PATTERN_i)PATTERN_outer_string(i_PATTERN_inner)_outer_string' ' :回圈。 /([^(]*)(([^)]*))(.*)/{ # 小寫的第二部分。 s//1L2E 3/; # 與保持空間混合。 G; s/(.*) (.*) (.*)/31 2/; # 將處理過的東西放入保存區 spcae h; s/ .*//; x; # 再次處理其他的東西。 s/.* //; bloop; }; # 保持空間是空的嗎? x; /^$/!{ # 模式空間有尾部的東西--添加它。 G; s/ //; # 我們將列印它。 h; # 清除保留空間 s/.*// };x; '輸出:
PATTERN_outer_string(i_pattern_inner)outer_string_PATTERN_string(pattern_i_pattern_i)_outer_stringuj5u.com熱心網友回復:
作為一個替代方案,在
gnu awk中使用匹配(...)子串的RS更容易做到:awk -v RS='([^)] )'/span> '{gsub(/PATTERN/, "pattern", RT); ORS=RT} 1'/span> file outer_string_PATTERN_string(pattern_i_pattern_i)PATTERN_outer_string(i_pattern_inner)_outer_string步驟:
- 。
RS=''([^)] )'捕獲一個(...)字串作為記錄分隔符- 。
gsub函式然后將PATTERN替換為匹配文本中的pattern,即RT- 。
ORS=RT設定ORS為新修改的RT- 。
1將每條記錄列印到stdout
另一種解決方案是在perlregex中使用lookahead斷言:perl -pe 's/PATTERN(?=[^()]*))/pattern/g' fileuj5u.com熱心網友回復:
這樣解決:
:/tmp$ sed 's/(/) (/g' sed.txt | sed 's/)/) /g' | sed '/([^)]*)/s/PATTERN/pattern/g' | sed ' :a;N;$! //g' outer_string_PATTERN_string(pattern_And_pattern_i)PATTERN_outer_string(i_pattern_inner) _outer_string
- 使模式
。()在一個新的行中- 找到
。()行,將PATTERN替換為pattern- 將多行合并為一行
。uj5u.com熱心網友回復:
sed可以實作嗎?它可以使用GNU
sed和基本的正則運算式來實作 (BRE):sed ' s/)/) /g :1 s/(([^)]*)PATTERN([^)]*) )/1pattern2/ t1 s/ //g ' < filewhere
- 第1個
之后插入一個新行。s在每個)- 第2個
s用pattern替換()內的最后一個(*是貪婪的)PATTERN。- 。
t如果進行了替換,則回圈往復- 第3個
。s剝離所有插入的新行EDIT
第二條
s替代命令根據OP的建議進行了編輯 因為沒有必要在中匹配里面的()。uj5u.com熱心網友回復:
你可以試試這個
sedsed -E 's/(. ?PATTERN. ?[^)]*)/L&/g'在這里,我們正在尋找匹配單詞
PATTERN,只有當它停留在括號內時。輸出
outer_string_PATTERN_string(pattern_i_pattern_i)PATTERN_outer_string(i_pattern_inner)_outer_string新的輸出示例
echo "outer_string_PATTERN_string(pattern_And_pattern_i)PATTERN_outer_string(i_pattern_inner)_outer_string"| sed -E 's/( . ?PATTERN. ?[^)]*)/L&/g' outer_string_PATTERN_string(pattern_And_pattern_i)PATTERN_outer_string(i_pattern_inner) _outer_string轉載請註明出處,本文鏈接:https://www.uj5u.com/net/324967.html
標籤:
