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="b
href="blah"
href="t
href="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 연산자를 사용하십시오 .