sed를 사용하여 패턴이 포함된 줄 바꾸기

sed를 사용하여 패턴이 포함된 줄 바꾸기

sed를 사용하여 패턴과 일치하는 줄의 특정 문자를 바꾸는 방법은 무엇입니까?

예: 문자로 시작하는 모든 줄을 일치시키고 끝에 있는 줄 바꿈을 탭으로 바꾸고 싶습니다. 나는 다음을 사용하려고 합니다: ( sed -e '/^[A-Z]/s/\n/\t/g'내가 관심 있는 줄은 도움이 된다면 항상 문자로 끝납니다).

입력 샘플

NAME_A
12,1
NAME_B
21,2

샘플 출력

NAME_A    12,1
NAME_B    21,2

답변1

sed '/^[[:alpha:]]/{$!N;s/\n/       /;}' <<\DATA
NAME_A
12,1
NAME_B
21,2
DATA

산출

NAME_A  12,1
NAME_B  21,2

문자로 시작하는 줄을 처리하고, 다음 줄이 있으면 끌어오고, 개행을 탭으로 바꿉니다.

비트 에는 s/\n/<tab>/여기에 리터럴 탭이 포함되어 있지만 일부 s는 해당 위치에서 이스케이프를 sed지원할 수도 있습니다.\t

재귀적인 경우를 처리하려면 다음과 같이 더욱 강력하게 만들어야 합니다.

sed '$!N;/^[[:alpha:]].*\n[^[:alpha:]]/s/\n/    /;P;D' <<\DATA
NAME_A
NAME_B
12,1  
NAME_C
21,2
DATA

산출

NAME_A
NAME_B  12,1
NAME_C  21,2

항상 데이터 세트 앞으로 한 행씩 이동합니다. 보시다시피 두 줄이 차례로 나타나는 경우 ^[[:alpha:]]개행 문자를 잘못 대체하지 않습니다 .

답변2

또 다른 해결책:

sed -e :a -e '$!N;s/\n\([^[:alpha:]]\)/ \1/;ta' -e 'P;D'

현재 줄이 Alphabeta로 시작하지 않으면 현재 줄이 이전 줄에 추가됩니다.

고쳐 쓰다

토론 후 @mikerserv가 제안한 솔루션은 다음과 같습니다.

sed ':a
/^[[:alpha:]]/{$!N;/\n[^[:alpha:]]/!ba;s/\(.*\)\n/\1\t/}
' file

설명하다

알파벳 문자로 시작하는 행에서 다음 문자가 있으면 끌어오고, 개행 문자 다음에 알파벳이 아닌 문자를 지정할 수 있으면 마지막 개행 문자까지 패턴 공간의 모든 항목을 선택합니다. 그런 다음 교체를 실행합니다. 마지막 새 줄을 탭 문자로 변경합니다. 하지만 그렇지 않다면 돌아가서 다시 시도합니다.

관련 정보