디렉토리에 다음 단어가 나타나는 텍스트 파일이 많이 있습니다.
GSM89103AATF
실제로 숫자는 변경될 수 있으므로 다른 예가 될 수 있습니다 GSM89089AATF
. 이러한 이벤트를 GSM89089\nAATF
새 행 삽입 으로 바꿔야 합니다 . 이것을 만드는 데 사용할 수 있나요 sed
?
답변1
GNU를 사용할 수 있습니다 sed
.
$ sed -r 's/(GSM[0-9]{5})(AATF)/\1\n\2/' file.in >file.out
이 패턴은 두 개의 별도 캡처 그룹의 첫 번째 부분과 일치한 다음 두 번째 부분과 일치합니다. 첫 번째 부분 뒤에는 항상 GSM
5자리 숫자가 따른다고 가정합니다 . 교체는 단순히 두 그룹 사이에 줄 바꿈을 사용하여 캡처한 데이터를 붙여넣는 것입니다.
-r
확장 정규식을 사용하고 있기 때문에 이것이 필요합니다. 일부 구현에서는 이러한 유형 대신 정규식을 sed
사용합니다 .-E
-r
GNU가 없는 시스템 sed
:
$ sed 's/\(GSM[0-9]\{5\}\)\(AATF\)/\1\
> \2' file.in >file.out
즉, ERE 대신 BRE를 사용하고 -r
GNU 확장을 제거하려면 a를 추가 \
하고 그 뒤에 Enter를 누른 \1
후 다음 줄에서 교체 패턴을 계속합니다. >
당신이 입력하는 것이 아니라 프롬프트입니다.
답변2
이것은 내 Mac 및 다양한 Linux 배포판에서 작동합니다.
#!/usr/bin/env bash
PATTERN="(GSM[0-9]{5})(AATF)"
sed -E -e $"s_${PATTERN}_\1\\
\2_g" < file_with_values
어디:
PATTERN
: 대체 표현식을 더 쉽게 읽을 수 있도록 변수에 패턴을 정의할 수 있습니다.sed -E -e
:sed
확장 정규식(-E)을 사용하고, 제공되는 스크립트(-e)를 사용하도록 설정합니다.$"..."
: 문자열을 번역하는데 사용되며, 변수를 허용합니다. 여기를 살펴보세요:배쉬 따옴표. 모든 경우에 안전하지는 않지만 귀하의 경우에는 괜찮을 것입니다s_ ..._...\2_g
: 는 대체 문자열입니다._
이스케이프할 필요가 없도록 구분 기호로 사용하고/
캡처 그룹(\1
and )이 필요하다는 점을 고려하면\2
문자열을 더 쉽게 읽을 수 있습니다 .\\
다음의 새로운 줄을 참고하세요 .$"..."
새로운 줄이 허용됨
변수가 필요하지 않은 경우 $'....'
작은따옴표와 함께 달러 기호를 사용할 수 있습니다. 이 경우 \n
새 행을 사용할 수는 있지만 삽입할 수는 없습니다.
사용법은 $"..."
상당히 이식성이 있는 것 같습니다. 내 코드는 비슷한 구현을 가지고 있으며 docker alpine, centos, debian, fedora, ubuntu에서 실행됩니다.