줄 내에서 패턴 앞에 줄 바꿈을 삽입하는 방법은 무엇입니까?
예를 들어 정규식 패턴 뒤에 줄 바꿈을 삽입합니다 .
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 -pe
sed 대신 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 호환 정규식을 사용 하는이 함께 제공됩니다 .