빈 줄과 특정 문자열을 이 문자열로 바꾸는 방법은 무엇입니까?

빈 줄과 특정 문자열을 이 문자열로 바꾸는 방법은 무엇입니까?

또는 무엇이든 빈 줄 뒤에 특정 문자열(예: or )을 이 문자열(따라서 or )로 바꾸는 방법은 무엇 sed입니까 ?awk&\end{align}&\end{align}

예를 들어, 다음은 초기 파일입니다(편집하다: 덜 모호한 예):

The quick brown fox jumps over the sleazy dog.

Indeed, the quick brown fox jumps over the sleazy dog.

\begin{align}


& foo

& bar

\end{align}

The quick brown fox jumps over the sleazy dog.

Indeed, the quick brown fox jumps over the sleazy dog.

내가 얻고 싶은 것은 다음과 같습니다.

The quick brown fox jumps over the sleazy dog.

Indeed, the quick brown fox jumps over the sleazy dog.

\begin{align}
& foo
& bar
\end{align}

The quick brown fox jumps over the sleazy dog.

Indeed, the quick brown fox jumps over the sleazy dog.

답변1

GNU sed정규식 작성을 돕기 위해 확장된 정규식 지원(-E)을 사용합니다.

sed -Ei -e '
  /./b
  :a
    $q;N
  /\n$/ba
  s/^\n+(&|\\(begin|end)\{align\})/\1/
' file

아이디어는 빈 줄 수집을 시작하고 비어 있지 않은 줄이 보이면 중지하는 것입니다. 그런 다음 정규 표현식은 빈 줄 뒤에 다음 세 줄 중 하나가 있는지 확인합니다.

  • 앰퍼샌드로 시작하는 줄&
  • \begin{align}으로 시작하는 줄
  • \end{align}으로 시작하는 줄

그런 다음 이러한 특정 빈 줄을 삭제합니다.

답변2

여러 줄 모드 에서 pcregrep:

pcregrep -M '^(?!\s+^(&|\Q\end{align}\E))' < file

하나 이상의 공백(개행 포함)이 뒤따르지 않는 줄의 시작, 다른 줄의 시작 및 위더 &또는 \end{align}.

또는 다음을 사용하여 perl:

perl -0777 -pe 's/^\s+^(&|\Q\end{align}\E)/$1/gm' < file

답변3

이는 제거됩니다모두정렬 블록의 빈 줄:

sed '/\\begin/,/\\end/ { /^$/d; }' file

내 Mac의 BSD sed에는 세미콜론이 필요하지만 GNU sed에는 필요하지 않습니다.

특정 블록 유형을 일치시키는 것이 더 까다롭습니다. 직접적인 방법은

sed '
  /\\begin{align}/,/\\end{align}/ { /^$/d; }
  /\\begin{equation}/,/\\end{equation}/ { /^$/d; }
' file

관련 정보