sed/awk를 사용하여 n번째 열을 열로 구분된 문자열로 바꾸는 방법

sed/awk를 사용하여 n번째 열을 열로 구분된 문자열로 바꾸는 방법

다음과 같은 문자열이 있다고 가정해 보겠습니다.

xyz="123" ; acd="234" ; plk="1234" ; apl="3456" ; www="2342"

plk="123"이제 and를 무시하고 sed를 사용하여 교체하고 싶습니다 .plk="789";""

산출:

xyz="123" ; acd="234" ; plk="789" ; apl="3456" ; www="2342

이 문제를 해결하도록 도와주시고 다른 명령을 사용할 수 있는지 알려주세요.

답변1

plk="1234"로 바꾸려면 plk="789"다음을 수행할 수 있습니다.

$ sed 's/plk="1234"/plk="789"/g' file
xyz="123" ; acd="234" ; plk="789" ; apl="3456" ; www="2342"

notplk="1234"그러나 이 항목도 로 대체됩니다 . 이를 방지하려면 단어 경계만 일치시키는 데 plk="789"사용할 수 있습니다 .\<

$ sed 's/\<plk="1234"/plk="789"/g' file
xyz="123" ; acd="234" ; plk="789" ; apl="3456" ; www="2342"

\<100% 이식 가능한지는 확실하지 않으므로 만일의 경우에 대비하여 다음과 같이 할 수도 있습니다.

$ sed -E 's/(^| )plk="1234"/plk="789"/g' file
xyz="123" ; acd="234" ;plk="789" ; apl="3456" ; www="2342"

아니면 대신 Perl을 사용하세요:

$ perl -pe 's/\bplk="1234"/plk="789"/g' file
xyz="123" ; acd="234" ; plk="789" ; apl="3456" ; www="2342"

위의 모든 명령( 및 sed) 을 사용하면 플래그를 추가하여 원본 파일을 제자리에서 편집 perl할 수 있습니다 .-i


위의 명령은 대체됩니다모두plk="1234"파일의 각 줄에서 발생하는 횟수입니다. 귀하의 질문에 설명하지 않았지만 제목에 "열 n"을 언급하셨습니다. 열을 어떻게 정의했는지, 무슨 뜻인지는 모르겠지만 ;세 번째로 구분된 열에서만 이 교체를 수행하려는 경우 다음을 시도해 볼 수 있습니다(GNU 사용 awk).

$ awk -F';'  'BEGIN{OFS=";"}{$3=gensub(/plk="1234"/,"plk=\"789\"",1,$3); }1' file
xyz="123" ; acd="234" ; plk="789" ; apl="3456" ; www="2342"

관련 정보