Sed - 替换单词

时间:2016-11-04 12:13:47

标签: sed

我在更换字符串时遇到问题。

|Stm=2|Seq=2|Num=2|Svc=101|MsgSize(514)=514|MsgType=556|SymbolIndex=16631

我想查找Svc出现|的情况,并与Stm交换位置,直到|出现。

我尝试更换角色,这不是我的目标。

3 个答案:

答案 0 :(得分:2)

awk -F'|' -v OFS='|' 
      '{a=b=0;
        for(i=1;i<=NF;i++){a=$i~/^Stm=/?i:a;b=$i~/^Svc=/?i:b}
        t=$a;$a=$b;$b=t}7' file

输出:

|Svc=101|Seq=2|Num=2|Stm=2|MsgSize(514)=514|MsgType=556|SymbolIndex=16631
  • 代码会交换Stm..Svc..的列,无论哪一个首先出现。

答案 1 :(得分:0)

您需要在字符串替换中使用捕获组和反向引用。

以下将交换2:

echo '|Stm=2|Seq=2|Num=2|Svc=101|MsgSize(514)=514|MsgType=556|SymbolIndex=16631' | sed 's/\(Stm.*|\)\(.*\)\(Svc.*|\)/\3\2\1/'

正如@Kent的评论中指出的那样,如果字符串不是那个顺序,这将不起作用。

答案 2 :(得分:0)

如果perl解决方案没问题,则假定搜索字词只有一列匹配

$ cat ip.txt 
|Stm=2|Seq=2|Num=2|Svc=101|MsgSize(514)=514|MsgType=556|SymbolIndex=16631

$ perl -F'\|' -lane '
@i = grep { $F[$_] =~ /Svc|Stm/ } 0..$#F;
$t=$F[$i[0]]; $F[$i[0]]=$F[$i[1]]; $F[$i[1]]=$t;
print join "|", @F;
' ip.txt
|Svc=101|Seq=2|Num=2|Stm=2|MsgSize(514)=514|MsgType=556|SymbolIndex=16631
  • -F'\|' -lane|上拆分输入行,另请参阅Perl flags -pe, -pi, -p, -w, -d, -i, -t?
  • @i = grep { $F[$_] =~ /Svc|Stm/ } 0..$#F获取与SvcStm
  • 匹配的列的索引
  • $t=$F[$i[0]]; $F[$i[0]]=$F[$i[1]]; $F[$i[1]]=$t交换两列
  • print join "|", @F打印修改过的数组