我在更换字符串时遇到问题。
|Stm=2|Seq=2|Num=2|Svc=101|MsgSize(514)=514|MsgType=556|SymbolIndex=16631
我想查找Svc
出现|
的情况,并与Stm
交换位置,直到|
出现。
我尝试更换角色,这不是我的目标。
答案 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
获取与Svc
和Stm
$t=$F[$i[0]]; $F[$i[0]]=$F[$i[1]]; $F[$i[1]]=$t
交换两列
($F[$i[0]], $F[$i[1]]) = ($F[$i[1]], $F[$i[0]]);
礼貌How can I swap two Perl variables print join "|", @F
打印修改过的数组