![결과](https://linux55.com/image/10716/%EA%B2%B0%EA%B3%BC.png)
[파이프] 구분 기호가 있는 입력 문자열이 있고 세 번째 및 다섯 번째 열의 빈 문자열을 문자별로 바꾸고 |
싶습니다 .&
입력 파일:
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 로 바꿉니다 &
. 완료되면 필드를 인쇄하면 됩니다.