표현식 뒤에 새 줄을 추가하는 방법

표현식 뒤에 새 줄을 추가하는 방법

다음과 비슷한 파일이 있습니다.

random_string
83: some words 45: large error report 326: send emails to certain peple
random_string
34: some words 143: job success

"#:" 패턴(숫자 뒤에 콜론이 있음)을 찾고 그 뒤에 오는 텍스트 뒤에 새 줄을 추가하여 다음과 같이 읽도록 하고 싶습니다.

random_string
83: some words
45: large error report
326: email certain people

random_string
34: some words
143: job success

나는 sed 명령을 시도했습니다.

sed "s#'([0-9]*[0-9]:)'#a '/n'#" file.txt
sed "s#'([0-9]*[0-9]:)'#\n#g" file.txt

(슬래시를 구분 기호로 사용하는 것을 좋아하지 않습니다. 울타리 기둥으로 인해 읽기가 어렵습니다.)

그리고 awk 명령:

awk '/[0-9]*[0-9]:/ {printf "%s\n",$0}' file.txt

그러나 둘 다 작동하지 않습니다. 여기에 게시된 비슷한 질문을 보고 해결 방법을 시도했지만 아무 효과가 없었습니다. 나는 대답이 아마도 매우 비슷할 것이고 심지어 내 숫자 표현식의 구문과 관련이 있을 수도 있다는 것을 알고 있지만 스스로 그것을 알아낼 수는 없습니다. 저는 awk와 sed를 선호하지 않지만, 이것이 제가 사용할 수 있는 최고의 도구가 될 것이라고 생각합니다.

돕다?

답변1

Perl 솔루션은 다음과 같습니다.

$ perl -pe 's/(\d+:.*?)(?=\d+:|$)/$1\n/g' file
random_string
83: some words 
45: large error report 
326: send emails to certain peple

random_string
34: some words 
143: job success

설명하다

  • (\d+:.*?): 하나 이상의 숫자( \d+)와 일치하고 :그 뒤에 a가 오고 나머지 정규식과 일치하는 가장 작은 문자열이 옵니다(in은 탐욕스럽지 않게 ?만들고 첫 번째 일치가 발견되면 중지됩니다). .*?여기서는 아래 설명된 섹션까지 계속합니다.
  • (?=\d+:|$): 이것은 ... (?=foo)불리운다긍정적 인 전망. 일치하지만 일치하는 내용은 실제 결과에 포함되지 않습니다. 따라서 이후의 모든 경우 bar(?=foo)가 일치됩니다 . 여기서는 ( ) 또는 줄 끝 ( ) 이 뒤따르는 일련의 숫자를 찾습니다 .barfoo:\d+:$

이제 대체 연산자는 첫 번째 패턴의 모든 항목을 자신과 개행 문자로 대체하여 원하는 출력을 제공합니다.

답변2

$ cat file
random_string
83: some words 45: large error report 326: send emails to certain peple
random_string
34: some words 143: job success

sed를 사용할 수 있습니다:

$ sed 's/[0-9]*: [a-z ]*/&\n/g' file

산출:

random_string
83: some words 
45: large error report 
326: send emails to certain peple

random_string
34: some words 
143: job success

답변3

awk문제를 해결하는 것 같습니다.

$ awk '{ for( i=1; i<=NF; i++ ) { if( match( $i, ":" ) ) { printf "\n" } printf( "%s ", $i ) } }' /path/to/file
random_string
83: some words
45: large error report
326: email certain people random_string
34: some words
143: job success

답변4

입력과 출력을 비교하면 원하는 내용에 대한 설명이 잘못된 것 같습니다. 당신은 말한다"패턴 #:(콜론이 뒤따르는 숫자)을 찾고 그 뒤에 새 줄을 추가하고 싶습니다."보다 정확한 설명은 다음과 같습니다.

  • 숫자 앞의 공백을 개행 문자로 바꾸고 그 뒤에 콜론이 옵니다.
  • 숫자로 시작하지 않고 비어 있지 않은 각 줄 앞에 개행 문자를 삽입합니다.
  • 아무것도 변경할 필요가 없으므로 입력의 첫 번째 줄을 건너뜁니다.

sed스크립트는 이를 달성합니다. 필요한 백슬래시 이스케이프 횟수를 최소화하고 가독성을 높이기 위해 기본 기본 정규식 -E대신 확장 정규식( )을 사용합니다 .sed

$ sed -E -e '2,$ {s/ ([0-9]+:)/\n\1/g; s/^[^0-9]/\n&/}' file.txt
random_string
83: some words
45: large error report
326: send emails to certain peple

random_string
34: some words
143: job success

[0-9]+:그런데 하나 이상의 공백 문자 앞에 공백 대신 탭 문자가 있을 수 있는 경우 [[:space:]]+공백 대신 탭 문자를 사용하세요. 예를 들어

sed -E -e '2,$ {s/[[:space:]]+([0-9]+:)/\n\1/g; s/^[^0-9]/\n&/}' file.txt

관련 정보