sed는 html 태그를 찾아 교체합니다.

sed는 html 태그를 찾아 교체합니다.

md 파일(일반 텍스트)에서 찾아서 바꿔야 합니다.

<span class="symbol">&#58771;</span>

이것으로:

[&#58771;]{custom-style="symbol"}

여러번 시도했는데 아무것도 안됐어요

sed -i -e 's/\(<span class=\"symbol\">\)&#58771;\(<\/span>\)/\[/&#58771;\]/\{custom-style=\"symbol\"\}/g'myfile.md

또는

sed -i -e "s#<span class=\"symbol\">&#58771;</span>#[&#58771;]{custom-style=\"symbol\"}#g" "Dignità umana e bioetica".md

하지만 항상 다음과 같은 오류 메시지가 나타납니다.

sed: -e expression #1, char 40: unknown option to `s'

이것작동하는 것 같습니다(오류 메시지 없음).

sed -i -e "s@<span class=\"symbol\">&#58771;</span>@[&#58771;]{custom-style=\"symbol\"}@g" myfile.md

그런데 난 이 코드를 받았어

[<span class="symbol">&#58771;</span>#58771;]{custom-style="symbol"} 

새로운 문자열은다음에 추가, 이전 것을 교체하지 마십시오.

해결됨

말씀하신 대로 이 명령은 작동합니다.

sed -i -e 's@<span class="symbol">\&#58771;<\/span>@[\&#58771;]{custom-style="symbol"}@g'

답변1

이것은 작동합니다:

sed -i -e "s@<span class=\"symbol\">&#58771;</span>@[\&#58771;]{custom-style=\"symbol\"}@g" myfile.md

\대체 텍스트가 특별하기 때문에 그 전에 사용해야 &제대로 작동합니다 &. 이는 "패턴과 일치하는 입력의 전체 부분"을 의미합니다.

에서 man sed:

s/정규식/교체/

대체 항목에는 패턴 공간의 일치하는 부분을 나타내는 특수 문자 &와 정규식에서 일치하는 해당 하위 표현식을 나타내는 특수 이스케이프 문자 \1~\9가 포함될 수 있습니다.

답변2

이게 나한테는 효과가 있는 것 같아

# echo '<span class="symbol">&#58771;</span>' > test 
# sed -i -e 's@<span class="symbol">\&#58771;<\/span>@[\&#58771;]{custom- 
style="symbol"}@g' test
# cat test 
[&#58771;]{custom-style="symbol"}

답변3

awk를 사용하세요

echo "<span class="symbol">&#58771;</span>" |awk -F'=|>|<' 'BEGIN { OFS=""; }{ print "["$4"]","{cumtom-style=""\""$3"\"""}"}'
[&#58771;]{cumtom-style="symbol"}

답변4

시도 중인 코드에 몇 가지 문제가 있습니다.

첫째, 텍스트에 존재하지 않는 문자를 명령의 구분 기호로 선택하면 작업이 더 쉬워집니다 s///. 또는 \텍스트에 나타나는 구분 기호를 사용하여 이스케이프해야 합니다.

첫 번째 명령에서,

sed -i -e 's/\(<span class=\"symbol\">\)&#58771;\(<\/span>\)/\[/&#58771;\]/\{custom-style=\"symbol\"\}/g'myfile.md

발생한 오류는 이스케이프되지 않은 /in 으로 인해 발생합니다.[/&#58771;\]

&또한 리터럴을 출력 텍스트 에 넣으려면 \대체 표현식에서 a를 사용하여 이스케이프해야 합니다. 그렇지 않으면 &특수한 것으로 해석되고 패턴 공간의 일치하는 부분으로 대체됩니다.

단순화를 위해 여기 /에서 불필요한 이스케이프 문자(아마도?)와 불필요한 이스케이프 문자 몇 개(아마도?)를 제거했습니다 [/&#58771;\]/\{custom-style=\"symbol\"\}. 또한 명령은 입력 텍스트에 표시되지 않으므로 |명령의 구분 기호로 선택했습니다 . s///명령은 다음과 같습니다.

sed -e 's|<span class="symbol">&#58771;</span>|[\&#58771;]{custom-style="symbol"}|g'

이것이 하는 일입니다:

$ echo '<span class="symbol">&#58771;</span>' | sed -e 's|<span class="symbol">&#58771;</span>|[\&#58771;]{custom-style="symbol"}|g'
[&#58771;]{custom-style="symbol"}

문자열이 정적이 아니고 해당 값에 관계없이 with 및 주변의 &#58771;를 바꾸려는 경우 캡처 그룹( ) 및 역참조(여기 ) 를 사용할 수 있습니다 .<span class="symbol">[</span>]{custom-style="symbol"}()\1

sed -e 's|<span class="symbol">\(.*\)</span>|[\1]{custom-style="symbol"}|g'

이 명령의 기능은 다음과 같습니다.

$ echo '<span class="symbol">whatever is here</span>' | sed -e 's|<span class="symbol">\(.*\)</span>|[\1]{custom-style="symbol"}|g'
[whatever is here]{custom-style="symbol"}

마지막으로 스크립트 주위에 큰따옴표( ') 대신 작은따옴표( ") 를 사용하여 sed셸에서 스크립트를 보호하는 것을 선호할 수도 있습니다 $. 매개변수 확장, 이스케이프에 의해 트리거됩니다 \.

관련 정보