Sed는 http://로 시작하지 않는 일부 줄을 대체합니다.

Sed는 http://로 시작하지 않는 일부 줄을 대체합니다.

sed에 갇혔습니다. html 파일의 링크가 http로 시작하지 않을 때 /를 접두사로 사용하려고 합니다. 이것이 이 문제를 해결하는 최선의 방법이 아닐 수도 있다는 것을 알고 있지만 간단하고 빠른 솔루션을 찾고 있습니다.

지금까지 나는 이것을 시도했습니다. (IRL에서는 -i in place 플래그 등을 사용할 것입니다. 이것은 단지 테스트용입니다.)

echo '<a href="egww">blah</a><a href="http://bloge.weg">yeah</a>' |
sed 's@href="[^http]@href="/@g'

이것은 거의 작동합니다.

<a href="/gww">blah</a><a href="http://bloge.weg">yeah</a>

첫 번째 링크의 첫 번째 문자가 잘리는 것 외에 h, t, t 또는 p가 일치하지 않는 것이 아니라 http 문자열 전체가 일치하지 않는 것 같습니다.

echo '<a href="egww">blah</a><a href="p/bloge.weg">damn</a>' |
sed 's@href="[^http]@href="/@g'

<a href="/gww">blah</a><a href="p/bloge.weg">damn</a>

나는 이 시점에서 혼란스러워하고 불행하게도 여기서는 인터넷 검색이 별로 도움이 되지 않습니다. 왜냐하면 sed의 부정은 일반적으로 일치하지 않는 줄의 하위 문자열이 아닌 문자열을 포함하는 줄을 제거하는 데 사용되기 때문입니다. 여러 가지 "일반적인" 정규식 패턴을 시도했지만 작동하지 않는 것 같습니다.

어떤 아이디어가 있나요?

답변1

[^http]아니요와는 별개로http. 이 RE는 h, nor t, nor 가 아닌 한 문자와 일치합니다 p. 따라서 에서는 href="[^http]일치 하지만 에서는 일치하지 않습니다 .href="bhref="blah"href="thref="toto"

여기서는 다음과 같은 것을 원합니다.

sed -E 's@(href=")([^h]|h([^t]|t([^t]|t([^p]|$)|$)|$)|$)@\1/\2@g'

뒤에는 href="not- h( 를 제외한 문자 h), h-not- t, ht-not- t, htt-not- p, htt-EOL, ht-EOL, h-EOL 또는 EOL이 옵니다. (EOL == "줄 끝", 마지막 4개는 "불일치를 의미하므로 입력에서 발견될 가능성이 없습니다 .)

sed( 아직 표준이 아닌 옵션을 지원한다고 가정 -E).

/Always를 추가하고 when 이후에 제거 할 수도 있습니다 href="/http.

sed 's@href="@&/@g;s@href="/http@href="http@g'

또는 다음을 사용하여 perl:

perl -pe 's|href="\K(?!http)|/|g'

perl부정 예측 RE 연산자를 사용하십시오 .

관련 정보