결과

결과

[파이프] 구분 기호가 있는 입력 문자열이 있고 세 번째 및 다섯 번째 열의 빈 문자열을 문자별로 바꾸고 |싶습니다 .&

입력 파일:

a a|b b|c c|d d|e e
f f|g g|h h|i i|j j

결과물 파일:

a a|b b|c&c|d d|e&e
f f|g g|h&h|i i|j&j

cc, ee, hh and jj사이의 공백이 다음 으로 대체되는 것을 볼 수 있습니다. 다음을 & 사용하여 파일을 읽는 대체 솔루션이 있습니다.while 루프그리고 구분 기호 기반 명령을 사용하여 cut위치 기반 변수에 저장하고 공백을 "&"로 바꾸고 sed모든 분리된 변수를 하나의 변수에 추가하고 새 파일에 추가합니다. 이를 달성하기 위해 사용할 수 있는 명령이 있습니까?

답변1

이를 위해 사용됩니다 awk:

awk -F\| '{gsub(" ","\\&",$3); gsub(" ","\\&",$5)}1' OFS=\| infile.txt 
  • , "awk"에게 필드가 -F\|파이프로 구분되어 있음 을 알려줍니다( 쉘에 의해 이스케이프 |되므로 다음과 같이 해석하지 마십시오).\pipeline stdin-F"|", 또는 )를 사용할 수 있습니다 -F'|'.

  • 이것gsub("regexp","replacement"[, INDEX])" "(공백)을 &인덱스(열)의 텍스트로 바꾸는 구문은 구분 기호를 기준으로 각 인덱스 위치 에 대해 아래에 나와 $3있습니다 .$5|

    a a|b b|c c|d d|e e
    ^^^|^^^|^^^|^^^|^^^
    $1 |$2 |$3 |$4 |$5
    

    자세히 알아보기왜 우리는 \\&그곳에서 두 번이나 탈출했는가? !

  • 1마지막에 무엇을 사용할 것인가 awk '{...}1'? 이것은 awk의 기본 인쇄 작업 제어입니다.자세한 내용을 읽어보세요

  • 다시 돌아가 OFS=\|거나 지정된 구분 기호가 있는 필드를 인쇄하세요 |.

답변2

넌 할 수있어

sed 's/\(|[^| ]*\) */\1\&/4;s//\1\&/2'

예를 들어 보겠습니다. 설명하다:

|[^| ]*열에서 필드 구분 기호와 공백이 아닌 모든 문자를 검색합니다. \(\)나중에 대체 항목으로 복사할 수 있도록 그룹화되어 있습니다 \1. 그러면 하나 이상의 공백이 대체되고 &대체 문자열에서 이스케이프되어야 합니다. 4이 방법을 네 번째 항목(즉, 다섯 번째 열)에 적용합니다. 그런 다음 2세 번째 열에 대해 이를 반복합니다. 빈 패턴을 제공하여 패턴을 반복할 필요가 없습니다.

열에 공백이 여러 개 있거나 공백이 전혀 없을 경우 상황은 더욱 복잡해집니다. 그렇다면 다른 도구를 사용하는 것이 좋습니다 awk.

반면에 각 열에 항상 공백이 있다는 것을 알고 있다면 간단한 작업을 수행하세요.

sed 's/ /\&/5;s//\&/3'

답변3

perl -aF'(\|)' -lne 's/\h/&/ for @F[2*2,2*4]; print @F' input_file

결과

a a|b b|c&c|d d|e&e
f f|g g|h&h|i i|j&j

피복재

파이프의 현재 레코드를 분할 |하고 필드에 구분 기호를 포함합니다. 따라서 3번째와 5번째 게임은 2*2, 2*4 게임이 된다.

\h두 필드 모두에서 가로 공백을 text 로 바꿉니다 &. 완료되면 필드를 인쇄하면 됩니다.

관련 정보