문자 앞에 기호 추가

문자 앞에 기호 추가

텍스트 파일이 있는데 각 줄에는 정의된 수의 필드가 있지만 줄마다 다를 수 있습니다. 내가 원하는 것은 행 필드의 각 값 앞에 "=" 기호를 추가하는 것입니다.

예를 들어 입력 파일

A   B   C   D   E
P   Q   R   S   T   U
L   M   N   O

결과물 파일

=A  =B  =C  =D  =E
=P  =Q  =R  =S  =T  =U
=L  =M  =N  =O

또한 이것은 단지 예일 뿐이며 내 파일에는 20개가 넘는 필드가 있는 일부 행이 포함되어 있습니다. 이를 효율적으로 수행하는 방법.

답변1

필드에 여러 문자가 포함되어 있다고 가정하면 GNU는 다음과 같습니다 sed.

sed 's/\</=/g' <<END
foo    bar    baz
A      B      C
apple  banana cherry
END
=foo    =bar    =baz
=A      =B      =C
=apple  =banana =cherry

GNU sed의 \<정규식 구성은 너비가 0인 "단어 시작" 표시(단어가 아닌 문자(또는 줄 시작)와 단어 문자(로케일의 숫자 또는 밑줄) 사이의 전환)입니다. 그래서 우리는 각각의 시작 부분을 바꿀 것입니다단어"=" 문자를 사용합니다.

(sed 정규식 참조여기)

답변2

더 짧은 awk버전:

$ awk 'gsub(/([^ ]+)/,"=&",$0)' file
=A   =B   =C   =D   =E
=P   =Q   =R   =S   =T   =U
=L   =M   =N   =O

설명하다

각 입력 라인에 대해 전역 교체를 수행합니다.

  • /([^ ]+)/: 각 필드와 일치합니다. 필드는 공백으로 구분되므로 이 정규식은 공백을 제외한 모든 항목과 일치합니다.

  • "=&"=: 각 필드 앞에 추가됩니다 .

&의미는 일치하는 문자로 대체됩니다. 에서 man awk:

gsub(r, s [, t])        For each substring matching the regular expres‐
                        sion  r  in the string t, substitute the string
                        s, and return the number of substitutions.   If
                        t  is  not  supplied,  use  $0.   An  &  in the
                        replacement text is replaced with the text that
                        was  actually matched.  Use \& to get a literal
                        &.  (This must be typed  as  "\\&";  see  GAWK:
                        Effective  AWK Programming for a fuller discus‐
                        sion of the rules for &'s  and  backslashes  in
                        the replacement text of sub(), gsub(), and gen‐
                        sub().)

고쳐 쓰다

@glenn jackman의 답변과 의견에 대한 응답으로 다음 위치에 동등한 버전을 추가했습니다 perl.

$ perl -pe 's/\b(?=\w)/=$&/g' file
=A   =B   =C   =D   =E
=P   =Q   =R   =S   =T   =U
=L   =M   =N   =O

답변3

에서 이를 수행하려면 다음을 awk사용할 수 있습니다.

awk '{for (i=1;i<=NF;i++) printf "=%s ",$i;printf "\n"}' filename

내부 NF(필드 수) 변수를 반복하고 앞에 등호를 사용하여 각 필드를 인쇄하고 공백을 추가한 다음 모든 필드를 인쇄한 후 개행을 인쇄합니다.

답변4

이 간단한 sed 명령을 사용해 보세요.

sed 's/\([A-Za-z]\+\)/=\1/g' file

예:

$ (echo 'A   B   C'; echo 'A C D F') | sed 's/\([A-Za-z]\+\)/=\1/g'
=A   =B   =C
=A =C =D =F

이 명령은 =기호를 앞에 배치합니다.A-Za-z

또는

또한 다음 명령을 시도해 보세요.

sed 's/\([ ]\+\)/\1=/g; s/^\(.*\)$/=\1/g' file

예:

$ (echo 'A   B   C'; echo 'A C D F') | sed 's/\([ ]\+\)/\1=/g; s/^\(.*\)$/=\1/g'
=A   =B   =C
=A =C =D =F

이 명령은 하나 이상의 공백을 하나 이상의 공백 더하기 기호로 바꾸고 시작 부분에 =배치됩니다 .=

관련 정보