[shell] 패턴 앞에 줄 바꿈을 삽입하는 방법은 무엇입니까?

줄 내에서 패턴 앞에 줄 바꿈을 삽입하는 방법은 무엇입니까?

예를 들어 정규식 패턴 뒤에 줄 바꿈을 삽입합니다 .

sed 's/regex/&\n/g'

패턴 앞에서 똑같이 어떻게 할 수 있습니까?

이 샘플 입력 파일이 있으면 일치하는 패턴이 전화 번호입니다.

some text (012)345-6789

되어야한다

some text
(012)345-6789



답변

이것은 작동 bash하고 zsh리눅스와 OS X에서 테스트 :

sed 's/regexp/\'$'\n/g'

일반적으로 $작은 따옴표로 묶인 문자열 리터럴 bash은 C 스타일 백 슬래시 대체를 수행합니다 (예 : $'\t'리터럴 탭으로 변환). 또한 sed는 개행 문자를 백 슬래시로 이스케이프 처리하기를 원하므로 \이전 $. 마지막으로 달러 기호 자체는 셸에서 해석되도록 따옴표로 묶지 않아야하므로 따옴표 앞에 따옴표 $를 닫았다가 다시여십시오.

편집 : @ mklement0의 의견에서 제안했듯이 다음과 같이 작동합니다.

sed $'s/regexp/\\\n/g'

여기서 일어나는 일은 : 전체 sed 명령은 이제 C 스타일 문자열입니다. 이는 새 줄 리터럴이 다른 백 슬래시로 이스케이프되기 전에 sed가 배치되어야하는 백 슬래시를 의미합니다. 더 읽기 쉽지만이 경우 셸 문자열 대체를 수행 할 수 없습니다 (다시 작성하지 않아도 됨).


답변

다른 답변 중 일부가 내 버전의 sed에서 작동하지 않았습니다. 의 위치를 전환 &하고하는 \n일을했다.

sed 's/regexp/\n&/g' 

편집 : 설치하지 않으면 OS X에서 작동하지 않는 것 같습니다 gnu-sed.


답변

sed에서는 출력 스트림에 개행을 쉽게 추가 할 수 없습니다. 어색한 연속 줄을 사용해야하지만 다음과 같이 작동합니다.

$ sed 's/regexp/\
&/'

예:

$ echo foo | sed 's/.*/\
&/'

foo

자세한 내용은 여기 를 참조 하십시오 . 조금 덜 어색한 것을 원한다면 perl -pesed 대신 match 그룹을 사용해보십시오 .

$ echo foo | perl -pe 's/(.*)/\n$1/'

foo

$1 그룹이 괄호 안에있는 정규식에서 첫 번째 일치 그룹을 나타냅니다.


답변

내 Mac에서 다음은 줄 바꿈 대신 단일 ‘n’을 삽입합니다.

sed 's/regexp/\n&/g'

이것은 개행으로 대체됩니다.

sed "s/regexp/\\`echo -e '\n\r'`/g"


답변

echo one,two,three | sed 's/,/\
/g'


답변

이 경우에는 sed를 사용하지 않습니다. 나는 tr을 사용한다.

cat Somefile |tr ',' '\012' 

쉼표를 사용하여 캐리지 리턴으로 바꿉니다.


답변

완전한 펄 정규 표현식 지원 (sed로 얻는 것보다 훨씬 강력 함) 의 장점으로 sed에서와 마찬가지로 perl one-liner를 사용할 수 있습니다 . * nix 플랫폼 간에는 변형이 거의 없습니다. perl은 일반적으로 perl입니다. 따라서 특정 시스템의 sed 버전을 원하는 방식으로 수행하는 방법에 대해 걱정하지 않아도됩니다.

이 경우에는 할 수 있습니다

perl -pe 's/(regex)/\n$1/'

-pe sed의 정상 작동 모드와 매우 유사하게 펄을 “실행 및 인쇄”루프에 넣습니다.

' 쉘이 방해하지 않도록 다른 모든 것을 인용

()정규 표현식을 둘러싼 그룹화 연산자입니다. $1대치의 오른쪽에이 parens에 일치하는 것이 인쇄됩니다.

마지막으로 \n줄 바꿈입니다.

괄호를 그룹화 연산자로 사용하는지 여부에 관계없이 일치시키려는 괄호를 피해야합니다. 따라서 위에 나열된 패턴과 일치하는 정규식은 다음과 같습니다.

\(\d\d\d\)\d\d\d-\d\d\d\d

\(또는 \)리터럴 패런과 \d일치하고 숫자 와 일치합니다.

보다 나은:

\(\d{3}\)\d{3}-\d{4}

나는 중괄호 안의 숫자가 무엇을하는지 알아낼 수 있다고 생각합니다.

또한 정규 표현식에 / 이외의 구분 기호를 사용할 수 있습니다. 따라서 일치 해야하는 경우 / 탈출 할 필요가 없습니다. 아래 중 하나는 내 대답의 시작 부분에있는 정규식과 같습니다. 이론적으로 당신은 표준 /의 문자 를 대체 할 수 있습니다 .

perl -pe 's#(regex)#\n$1#'
perl -pe 's{(regex)}{\n$1}'

몇 가지 최종 생각.

사용은 -ne대신 -pe유사하게 작용하지만, 자동으로 마지막에 인쇄되지 않습니다. 직접 인쇄하려는 경우 편리 할 수 ​​있습니다. 예를 들어, 여기 grep-alike가 있습니다 ( m/foobar/정규식 일치).

perl -ne 'if (m/foobar/) {print}'

줄 바꿈 문제를 다루는 것을 발견하고 마술처럼 다루기를 원한다면을 추가하십시오 -l. 그러나 개행 작업을 한 OP에게는 유용하지 않습니다.

보너스 팁-pcre 패키지가 설치되어 있으면 pcregrep전체 perl 호환 정규식을 사용 하는이 함께 제공됩니다 .