sed를 사용하여 개행 문자를 삽입하시겠습니까?

sed를 사용하여 개행 문자를 삽입하시겠습니까?

디렉토리에 다음 단어가 나타나는 텍스트 파일이 많이 있습니다.

GSM89103AATF

실제로 숫자는 변경될 수 있으므로 다른 예가 될 수 있습니다 GSM89089AATF. 이러한 이벤트를 GSM89089\nAATF새 행 삽입 으로 바꿔야 합니다 . 이것을 만드는 데 사용할 수 있나요 sed?

답변1

GNU를 사용할 수 있습니다 sed.

 $ sed -r 's/(GSM[0-9]{5})(AATF)/\1\n\2/' file.in >file.out

이 패턴은 두 개의 별도 캡처 그룹의 첫 번째 부분과 일치한 다음 두 번째 부분과 일치합니다. 첫 번째 부분 뒤에는 항상 GSM5자리 숫자가 따른다고 가정합니다 . 교체는 단순히 두 그룹 사이에 줄 바꿈을 사용하여 캡처한 데이터를 붙여넣는 것입니다.

-r확장 정규식을 사용하고 있기 때문에 이것이 필요합니다. 일부 구현에서는 이러한 유형 대신 정규식을 sed사용합니다 .-E-r

GNU가 없는 시스템 sed:

$ sed 's/\(GSM[0-9]\{5\}\)\(AATF\)/\1\
> \2' file.in >file.out

즉, ERE 대신 BRE를 사용하고 -rGNU 확장을 제거하려면 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: 는 대체 문자열입니다. _이스케이프할 필요가 없도록 구분 기호로 사용하고 /캡처 그룹( \1and )이 필요하다는 점을 고려하면 \2문자열을 더 쉽게 읽을 수 있습니다 . \\다음의 새로운 줄을 참고하세요 . $"..."새로운 줄이 허용됨

변수가 필요하지 않은 경우 $'....'작은따옴표와 함께 달러 기호를 사용할 수 있습니다. 이 경우 \n새 행을 사용할 수는 있지만 삽입할 수는 없습니다.

사용법은 $"..."상당히 이식성이 있는 것 같습니다. 내 코드는 비슷한 구현을 가지고 있으며 docker alpine, centos, debian, fedora, ubuntu에서 실행됩니다.

관련 정보