특정 범위의 문자를 동일한 수의 문자로 바꿉니다.

특정 범위의 문자를 동일한 수의 문자로 바꿉니다.

길이가 다른 물결표 문자가 포함된 문자열을 공백 문자열로 바꾸고 싶습니다. 예를 들어, 문자열에 물결표 문자 5개가 포함되어 있으면 ~~~~~공백 5개로 바꾸고 싶습니다.

내 현재 sed명령:

sed -e '/\\begin{alltt}/,/\\end{alltt}/s/~\+/ /' test.tex

하나 이상의 물결표 문자를 확인할 수 있지만 삽입된 공백의 길이를 검색하는 방법을 모르겠습니다

답변1

sed '/\\begin{alltt}/,/\\end{alltt}/s/~/ /g'

~모든 s를 공백으로 바꿉니다. ~각 행의 순서에서 첫 번째 s 만 바꾸려면 다음을 수행할 수 있습니다.~

sed '
  /\\begin{alltt}/,/\\end{alltt}/{
    /~/ {
      h; # save a copy
      s/\(~\{1,\}\).*/\1/; # remove everything after the first sequence of ~s
      s/~/ /g; # replace ~s with spaces
      G; # append the saved copy
      s/\n[^~]*~*//; # retain only what's past the first sequence of ~s
                     # from the copy
    }
  }'

참고: \{1,\}GNU 확장과 동등한 표준 \+.

다음을 사용하는 것이 더 쉽습니다 perl.

perl -pe 's{~+}{$& =~ s/~/ /gr}e if /\\begin\{alltt\}/ .. /\\end\{alttt\}/'

또는:

perl -pe 's{~+}{" " x length$&}e if /\\begin\{alltt\}/ .. /\\end\{alttt\}/'

관련 정보