쉘 스크립트가 정규식과 일치하는 범위 내에서 패턴을 찾고 바꿀 수 있습니까?

쉘 스크립트가 정규식과 일치하는 범위 내에서 패턴을 찾고 바꿀 수 있습니까?

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. 연속된 빈 줄은 한 줄로 축소됩니다.

관련 정보