텍스트 파일이 있는데 각 줄에는 정의된 수의 필드가 있지만 줄마다 다를 수 있습니다. 내가 원하는 것은 행 필드의 각 값 앞에 "=" 기호를 추가하는 것입니다.
예를 들어 입력 파일
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-Z
a-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
이 명령은 하나 이상의 공백을 하나 이상의 공백 더하기 기호로 바꾸고 시작 부분에 =
배치됩니다 .=