sed 또는 awk를 사용하여 열 사이의 텍스트 바꾸기

sed 또는 awk를 사용하여 열 사이의 텍스트 바꾸기

다음 형식의 텍스트를 바꾸는 방법을 찾으려고 합니다.

input1:input2:input3
aaa:bbb:ccc
111:222:333

나는 결과가 다음과 같기를 원합니다:

input1:new-text:input3
aaa:new-text:ccc
111:new-text:333

결과가 좋다면 sed, awk, cut 또는 다른 어떤 것으로든 수행할 수 있습니다.

답변1

awk는 "콜론으로 구분된 두 번째 필드를 "로 대체하는 규칙을 고려하여 new-text이를 매우 간단하게 만듭니다 .

awk -F':' 'BEGIN { OFS=FS } {$2="new-text"; print} ' < input > output

-F':'콜론을 사용하여 각 줄의 필드를 구분하도록 awk에 지시합니다 .

BEGIN섹션은산출나중에 행을 다시 인쇄할 때 awk가 콜론을 다시 사용하여 필드를 결합할 수 있도록 필드 구분 기호를 현재 필드 구분 기호(콜론)로 변경합니다.

두 번째 부분 앞에는 조건이 없으므로 각 줄이 실제로 실행되는 것은 두 번째 필드를 다음으로 바꾼 new-text다음 새 줄을 인쇄하는 것입니다.

답변2

파일의 각 줄에 있는 유일한 ":" 쌍 사이의 중간 블록을 대체하기 위해 정확히 동일한 텍스트가 필요한 경우 이 방법이 작동할 수 있습니다.

sed -i -- "s|:.*:|:${mynewtext}:|"   $inputfile

Pattern.*은 하나 이상의 문자만 나타냅니다.

답변3

텍스트가 다음과 같은 파일에 있다고 가정해 보겠습니다.code

]$cat code
input1:input2:input3
aaa:bbb:ccc
111:222:333

이 명령을 실행하세요

]$sed -e 's/:[^:]*:/:new-text:/' code
input1:new-text:input3
aaa:new-text:ccc
111:new-text:333

답변4

제거할 열을 제공하고 코드를 실행하는 동안 sed교체할 열의 새 내용을 제공할 수 있는 일반 및 POSIX sed 방식으로 이를 보려면 다음을 수행할 수 있습니다.

n=2;             # the column number to be modified with a new value

repl="new-text"; # the text used to replace the contents of the n-th col

# to make the replacement sed friendly, otw, if it happened to have chars
# which have a meaning to sed when using on the rhs of s/// command, we will
# have an error on our hands.
repl_esc=$(printf '%s\n' "$repl" | sed -e 's|[\&/]|\\&|g;$!s/$/\\/')

sed -e '
    s/.*/:&:/
    '"s/:/\\n/$n;s//\\
/$n;
    s/\\n.*\\n/:${repl_esc}:/"'
    s/^://
    s/:$//
' input-file.txt

관련 정보