stdout
특정 정규식과 일치하는 모든 단락의 모든 개행을 공백으로 바꾸는 쉘 명령을 작성하고 싶습니다 . 여기서는 두 개 이상의 줄 바꿈으로 끝나는 텍스트를 단락으로 정의합니다.
(
특히, 또는로 시작하지 않는 텍스트 단락을 모두 찾아서 $
이 단락에서 줄 바꿈을 모두 제거하고 싶습니다.
예를 들어 내 스크립트를 실행해 보세요.
Aliquam erat volutpat. Nunc ( eleifend leo vitae magna. In (i)yd erat non orci
commodo lobortis. Proin $ neque massa, cursus ut, gravida ut, lobortis eget,
lacus. Sed diam.
Hello world.
(Nullam tristique diam
non turpis.
Hello
$again!
$foo
bar
결과가 나와야 한다
Aliquam erat volutpat. Nunc ( eleifend leo vitae magna. In (i)yd erat non orci commodo lobortis. Proin $ neque massa, cursus ut, gravida ut, lobortis eget, lacus. Sed diam.
Hello world.
(Nullam tristique diam
non turpis.
Hello $again!
$foo
bar
가능합니까?
추가 줄바꿈을 추가하는 것과 같은 부수적인 손상이 있는지는 신경 쓰지 않습니다(하지만 부수적인 손상 없이 수행할 수 있는지도 궁금합니다!).
답변1
모든 Unix 시스템의 모든 쉘에서 awk를 사용하십시오.
$ awk -v RS= -v ORS='\n\n' -F'\n' '!/^[($]/{$1=$1} 1' file
Aliquam erat volutpat. Nunc ( eleifend leo vitae magna. In (i)yd erat non orci commodo lobortis. Proin $ neque massa, cursus ut, gravida ut, lobortis eget, lacus. Sed diam.
Hello world.
(Nullam tristique diam
non turpis.
Hello $again!
$foo
bar
위의 코드는 처음에 빈 줄이 없더라도 파일의 마지막 단락을 포함하여 모든 단락 뒤에 빈 줄을 인쇄합니다. 이것이 문제인 경우에는 알려주지 않기가 쉽기 때문에 알려주시기 바랍니다.
답변2
여분의 빈 줄은 중요하지 않기 때문에
gawk 'BEGIN {RS=""} !/^[$(]/ {gsub("\n"," ")} {print;print "\n"}'
설명하다. RS=""
gawk를 단락 모드로 설정합니다. 또는 로 시작하지 않는 단락 !/^[$(]/
과 일치합니다 . 줄 바꿈을 공백으로 변경하십시오. 출력 데이터 및 개행.(
$
gsub("\n"," ")
print;print "\n"
답변3
GNU sed
단락을 예약된 공간에 저장하세요. 이 방법은 여러 개의 빈 줄을 유지합니다.
sed -e '
/./,/^$/!b
H;/./{$!d;}
z;x;s/.//;$!s/.$//
/^[$(]/!y/\n/ /
$!G
' file
perl -pl -00e '
y/\n/ / unless /^[$(]/;
s/$/\n/ unless eof;
' file
Perl의 단락 모드 -00
. 연속된 빈 줄은 한 줄로 축소됩니다.