텍스트 문자열을 바꾸고 그 사이의 내용을 캡처합니다.

텍스트 문자열을 바꾸고 그 사이의 내용을 캡처합니다.

LaTeX 문서를 편집 중인데 '\parallel'의 모든 인스턴스를 'something' \parallel something \parallel으로 변경해야 할 \norm{something}때가 있습니다. '\parallel'과 'something' 사이에 공백이 없습니다. 나는 사용하려고

$ sed -i 's/\\parallel[.*]\\parallel/\\norm\{\1\}/g' a.txt  $

그러나 "잘못된 참조" 오류가 반환됩니다. 올바른 코드는 무엇입니까 sed?

답변1

이 작업을 수행할 때:

$ sed -i 's/\\parallel[.*]\\parallel/\\norm\{\1\}/g' a.txt

, 캡처 그룹을 사용하고 있지 않습니다.

[]지정한 문자 클래스에서. 문자 클래스는 그 중 하나로 대체될 수 있는 여러 기호입니다. 따라서 RE는 [.*]"문자열"이 아닌 정확히 일치하는 것과 같습니다 ..*

캡처 그룹은 로 표시됩니다 \(RE\). 따라서 아래와 같이 []로 바꿔야 합니다 .\(\)

$ sed -i 's/\\parallel\(.*\)\\parallel/\\norm{\1}/g' a.txt

을 통해 액세스할 수 있습니다 \1.

답변2

sed -i -e 's/\\parallel\s\+\(.*\S\)\s*\\parallel/\\norm {\1}/g' a.txt

\1대체 문자열의 내용은 검색 패턴의 첫 번째 \(... 를 참조합니다.\)

"확장된" 정규식 구문을 선호하는 경우

sed -i -r -e 's/\\parallel\s+(.*\S)\s*\\parallel/\\norm \{\1\}/g' a.txt

답변3

바꾸다:

$ sed -i 's/\\parallel[.*]\\parallel/\\norm\{\1\}/g' a.txt $

이것으로:

$ sed -i 's/\\parallel\(.*\)\\parallel/\\norm\{\1\}/g' a.txt

그게 효과가 있을 거야

답변4

저는 무엇을 몰랐는지 몰라서 [:alnum:]을 사용했습니다.

sed -r 's#\\parallel[ ]*([[:alnum:]]+)[ ]*\\parallel#\\norm{\1}#g'

관련 정보