[英]Replace lines using sed command with regex
我想使用sed linux命令替換文件中的某些行。 這是我要實現的目標:
cn.x1.x2 y -> cn_x1.x2 y
cn.x1.x2.x3 y -> cn_x1_x2.x3 y
cn.x1.x2.x3.x4 y -> cn_x1_x2_x3.x4 y
我想找到任何以'cn'開頭的單詞,並用下划線替換點,直到倒數第二個單詞為止。 如何使用正則表達式實現此目的?
提前致謝
您可以使用sed
分兩步進行操作:
echo 'cn.x1.x2.x3.x4 y' | sed -r 's|\.|_|g; s|\_([^_]*)$|.\1|'
第一步用下划線s|\\.|_|g;
替換所有點s|\\.|_|g;
第二步用點代替最后一個下划線。 s|\\_([^_]*)$|.\\1|
這可能對您有用(GNU sed):
sed -E ':a;s/\.([^.]*\.)/_\1/;ta' file
用下划線代替兩個句號中的第一個,並重復直到匹配失敗。
Perl進行救援!
perl -pe 's/\./_/ while /cn.*\..*\./' < input > output
換句話說,替換.
至少有兩個點時用_
。
如果您的數據在“ d”文件中,則通過gnu sed:
sed -E 'h; s/(cn\S+)\.\S+\s\S+$/\1/;s/\./_/g;G;s/(.*)\ncn\S+(\.\S+\s\S+)$/\1\2/' d
通過perl:
perl -pe 's/(?!.[^.]+\s\S+$)\./_/xg' d
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.