正则表达式用同一行unix上的另一个单词替换单词

时间:2012-04-24 09:34:50

标签: regex perl unix sed awk

设A,B,C,D为单词

输入文件:

..
A/B/C/D 
W/B/C/Z 
L/B/C/O   
..

输出文件:

..
A/B/C/A
W/B/C/W 
L/B/C/L 
..

word D替换为word A同一行,仅当行中存在/B/C/分隔符且其他行明智时

要完成该任务的sed/awk/perl oneliner

6 个答案:

答案 0 :(得分:3)

这是一个awk解决方案:

awk -F/ -v OFS=/ '$2=="B" && $3=="C" {$4=$1}1' input.txt

答案 1 :(得分:2)

pearl.306> echo "A/B/C/D"|awk '{split($0,a,"/");print a[1]"/"a[2]"/"a[3]"/"a[1]}'
A/B/C/A
pearl.307> 

另一种方式是:

pearl.309> echo "A/B/C/D" | awk -F"/" '{OFS="/"}{$NF=$1;print}'
A/B/C/A
pearl.310> 

pearl.318> cat file1
A/B/C/D
W/B/C/Z
L/B/C/O
pearl.319> awk -F"/" '{OFS="/"}{$NF=$1;print}' file1
A/B/C/A
W/B/C/W
L/B/C/L
pearl.320> 

答案 2 :(得分:2)

你可以这样做:

sed -re 's/^([^/]*)(\/B\/C\/)([^/]*)$/\1\2\1/' file

演示:

$ cat file
A/B/C/D
W/B/C/Z
L/B/C/O

$ sed -re 's/^([^/]*)(\/B\/C\/)([^/]*)$/\1\2\1/' file
A/B/C/A
W/B/C/W
L/B/C/L

答案 3 :(得分:2)

这可能对您有用:

sed 's|^\(\(.\)/B/C/\).|\1\2|' file

如果A/B/C/D是真实的话,例如wordA/wordB/wordC/wordD,然后:

sed 's/|^\(\([^/]*\)/wordB/wordC/\).*|\1\2|' file    

答案 4 :(得分:1)

这应该可以解决问题。 perl -p -e's / D / A / g'

在sed sed -e's / D / A /'

答案 5 :(得分:0)

 perl -pe 's#(/B/C/)(.*)#$1$`#' file

这应该有效+