2016-11-04 3 views
0

문자열 바꾸기에 문제가 있습니다.Sed - 단어 바꾸기

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

나는 Stm|까지 나타납니다와 Svc|까지 나타납니다 발생 및 스왑 장소를 찾고 싶어요.

내 시도가 문자 교체로 갔지만 이것이 내 목표는 아닙니다.

+0

죄송 수정 된 배열 - swaping - 교체하지 –

+2

할 수 있습니다 [편집] (https : //로 유래 .com/posts/40422418/edit) 귀하의 질문도. :) 시도한 명령을 추가 할뿐만 아니라 명확성을 위해 예상 결과를 추가하십시오. – Sundeep

+1

awk가 sed를 처리하는 것보다 우수합니다. – mouviciel

답변

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에서 주석 지적이 작동하지 않습니다.

+0

''Svc'가 처음 오는 경우 – Kent

+0

당신이 지적했듯이 그것은 그 시나리오를 다루지 않을 것입니다. – c3st7n

+0

오타가 있습니다. BRE를 사용하고 있으면 안되는'|'를 이스케이프 처리했습니다. – Sundeep

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..의 칼럼. perl 솔루션은 괜찮
0

경우, 하나의 열이

$ 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|에 분할 입력 라인, Svc 일치하는 열 Perl flags -pe, -pi, -p, -w, -d, -i, -t?
  • @i = grep { $F[$_] =~ /Svc|Stm/ } 0..$#F GET 지수도 참조 검색어에 대한 각각의 일치 가정 및 Stm
  • $t=$F[$i[0]]; $F[$i[0]]=$F[$i[1]]; $F[$i[1]]=$t 스왑 t 그는 두 개의 열
  • print join "|", @F 프린트 내 영어에 대한