문자열 바꾸기에 문제가 있습니다.Sed - 단어 바꾸기
|Stm=2|Seq=2|Num=2|Svc=101|MsgSize(514)=514|MsgType=556|SymbolIndex=16631
나는 Stm
|
까지 나타납니다와 Svc
|
까지 나타납니다 발생 및 스왑 장소를 찾고 싶어요.
내 시도가 문자 교체로 갔지만 이것이 내 목표는 아닙니다.
문자열 바꾸기에 문제가 있습니다.Sed - 단어 바꾸기
|Stm=2|Seq=2|Num=2|Svc=101|MsgSize(514)=514|MsgType=556|SymbolIndex=16631
나는 Stm
|
까지 나타납니다와 Svc
|
까지 나타납니다 발생 및 스왑 장소를 찾고 싶어요.
내 시도가 문자 교체로 갔지만 이것이 내 목표는 아닙니다.
문자열 대체에서 캡처 그룹 및 역 참조를 사용해야합니다.
은 아래의 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에서 주석 지적이 작동하지 않습니다.
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
솔루션은 괜찮경우, 하나의 열이
이$ 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 그는 두 개의 열
($F[$i[0]], $F[$i[1]]) = ($F[$i[1]], $F[$i[0]]);
예의 How can I swap two Perl variablesprint join "|", @F
프린트 내 영어에 대한
죄송 수정 된 배열 - swaping - 교체하지 –
할 수 있습니다 [편집] (https : //로 유래 .com/posts/40422418/edit) 귀하의 질문도. :) 시도한 명령을 추가 할뿐만 아니라 명확성을 위해 예상 결과를 추가하십시오. – Sundeep
awk가 sed를 처리하는 것보다 우수합니다. – mouviciel