다음과 비슷한 파일이 있습니다.
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)
가 일치됩니다 . 여기서는 ( ) 또는 줄 끝 ( ) 이 뒤따르는 일련의 숫자를 찾습니다 .bar
foo
:
\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