다음과 같은 파일이 있습니다.
method AAA one (1,111):
some_text_1
method BBB two (2,
222):
tuesday
method CCC three (3,
333):
sunny_day
method DDD four (4,
444_a,
444_b):
last_week
나는 그것이 다음과 같이 보이기를 원합니다 :
method AAA one (1,111):
some_text_1
method BBB two (2,222):
tuesday
method CCC three (3,333):
sunny_day
method DDD four (4,444_a,444_b):
last_week
거의 그런 일을 하는 sed 명령이 있습니다:
sed -i '/method/,/):/ p; :a; N; $!b a; s/\n\s\{1,\}//g' file.txt
다음과 같은 출력이 제공됩니다.
method AAA one (1,111):
method AAA one (1,111):some_text_1
method BBB two (2,222):tuesday
method CCC three (3,333):sunny_day
method DDD four (4,444_a,444_b): last_week
답변1
기반으로Sed 한 줄 명령에 대한 자세한 설명, 1부: 파일 간격, 번호 매기기, 텍스트 변환 및 교체,39. 줄이 백슬래시 "\"로 끝나면 다음 줄에 추가합니다., 그러나 백슬래시를 쉼표로 변경하고 다음 공백을 포함하도록 교체를 확장합니다.
$ sed -e :a -e '/,$/N; s/,\n[[:blank:]]*/,/; ta' file
method AAA one (1,111):
some_text_1
method BBB two (2,222):
tuesday
method CCC three (3,333):
sunny_day
method DDD four (4,444_a,444_b):
last_week
답변2
그리고 awk
:
awk 'f{sub(/^[[:space:]]+/, "")} {f=/,$/; ORS = f ? "" : RS} 1'
f
줄이 로 끝날 때마다 플래그를 설정합니다 ,
. 플래그에 따라 출력 레코드 구분 기호는 빈 문자열이거나 입력 레코드 구분 기호와 동일합니다(기본값은 개행). 이 플래그가 설정될 때마다 다음 줄의 시작 공백 문자도 제거됩니다.
의 경우 perl
입력이 단일 문자열로 처리될 수 있을 만큼 작다고 가정합니다.
perl -0777 -pe 's/,\n\s*/,/g'
다음으로 끝나는 줄이 함수의 일부가 ,
아닌 경우 위의 해결 방법은 실패합니다. method
이 경우 ()
부품에 문자 쌍만 있다고 가정하면 method
다음을 사용할 수 있습니다.
perl -0777 -pe 's/method[^(]+\([^)]+\)/$&=~s|\n\s*||gr/ge'
이는 첫 번째 문자부터 문자까지 일치 method[^(]+\([^)]+\)
합니다 . 교체 부분에는 일치 부분에서 작동하여 개행 문자와 선택적 공백 문자를 제거하는 또 다른 Perl 코드가 있습니다.method
(
)
답변3
사용 gawk
:
awk 'function del_space(){gsub(/^\s+/,""); };
/,$/ {if (NR==l) del_space(); a=a $0; l=NR+1; next}
NR==l{del_space(); $0=a $0; a=""}1' file
줄 끝에서 쉼표가 발견될 때마다 변수는 a
현재 입력 레코드( $0
), 공백, 이전 레코드를 보유합니다. 이 레코드에 대한 추가 작업을 방지합니다. 즉, next
명령 끝에 인쇄 관용구가 사용되면 인쇄가 발생하지 않습니다.awk
1
패턴 일치 후 다음 레코드에서는 $0=a $0;a="";
현재 입력 레코드( $0
)가 로 설정되고 a
그 다음에는 각각 이전 설정 $0
과 변수 a
설정이 로 설정됩니다 ""
.
이 함수는 del_space()
레코드의 끝을 찾은 후 다음 레코드의 시작 부분에 있는 공백을 대체합니다.,
쉼표 뒤에 공백을 넣으려면 다음과 같이 변경해야 합니다.
awk 'function del_space(){gsub(/^\s+/,""); };
/,$/ {if (NR==l) del_space(); a=a $0; l=NR+1; next}
NR==l{del_space(); $0=a FS $0; a=""}1' file
답변4
또 다른 sed
(POSIX):
sed ':a;/^method/!b;/[^:]$/N;s/[[:space:]]*\n[[:space:]]*/ /g;ta'
- DEF 태그
:a
- IF 패턴 공간이 다음으로 끝나지 않습니다.
method
- 그럼 끝까지 건너뛰세요
b
- 그럼 끝까지 건너뛰세요
- ELSE로 끝나지 않는 경우
:
- 그런 다음 다음 줄 추가를 사용하십시오
N
.
- 그런 다음 다음 줄 추가를 사용하십시오
spaces
* +\n
+spaces
*를 다음으로 바꾸세요 .' '
- 교체품이 있으면 반품하세요.
:a
- 교체품이 있으면 반품하세요.
- 인쇄 종료
비슷한 상황을 처리해야 합니다.
method XXX foo (8,
888):
bar,
baz
method
HHH
bar
(
aa,
bb):
lor
매개변수 주위에 약간의 추가 공백이 남습니다.