sed를 사용하여 특정 열의 첫 번째 문자를 삭제하는 방법

sed를 사용하여 특정 열의 첫 번째 문자를 삭제하는 방법

다음과 같은 구조의 파일이 있습니다.

999963803|081439403|FFF|33
999964211|081823904|FFF|33
999970948|081765738|FFF|33
999971835|081736346|FFF|33
999972780|082127527|FFF|33

두 번째 열의 첫 번째 문자를 제거해야 합니다. 사용해 보았 sed "s/|.1|/^.\(.*\)/\1/" my_file.txt으나 작동하지 않습니다. 결과는 다음과 같아야 합니다.

999963803|81439403|FFF|33
999964211|81823904|FFF|33
999970948|81765738|FFF|33
999971835|81736346|FFF|33
999972780|82127527|FFF|33

답변1

awk를 사용하세요:

 awk -F"|" '{print $1"|"substr($2,2)"|"$3"|"$4}' <test

답변2

POSIX sed 사용:

sed -e 's/[^|]\([^|]*|\)/\1/2' <file

정규식은 을 [^|][^|]*|제외한 하나 이상의 문자 시퀀스를 나타내므로 마지막 필드를 제외한 모든 필드와 일치하므로 마지막 필드와 일치 |해야 합니다 . ubstitute 명령 으로 수정자는 두 번째 항목(즉, 두 번째 필드)만 바꿉니다.[^|][^|]*$2s

GNU 또는 BSD sed를 사용하면 구문을 다음과 같이 단순화할 수 있습니다.

sed -E 's/[^|]([^|]*|)/\1/2' <file

(sed -E는 다음 POSIX 버전에서 표준이 될 것입니다.)

답변3

왜 그렇게 복잡합니까?

이것은 첫 번째 문자 다음의 첫 번째 문자 |이므로
sed <filename -e 's/|./|/'
작동해야 합니다.

즉, 첫 번째 |문자와 후속 문자를 찾아 |.

예를 들어:

$ sed <my_file.txt -e 's/|./|/'
999963803|81439403|FFF|33
999964211|81823904|FFF|33
999970948|81765738|FFF|33
999971835|81736346|FFF|33
999972780|82127527|FFF|33

참고: /g첫 번째 항목뿐만 아니라 모든 항목을 바꾸려면 끝에 추가하세요.

답변4

이것은 간단합니다 awk.

awk -F"|" '{OFS="|"}$2=$2*1' file

OFS출력 필드 구분자를 정의합니다. $2=$2*1두 번째 필드를 곱하면 1앞에 오는 0이 사라집니다.

관련 정보