[^http]
не является ничем, кроме http
. Этот RE соответствует одному символу, если это не h
, не t
, не 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
).
Вы также можете добавить /
всегда, но удалить его после, когда в href="/http
:
sed 's@href="@&/@g;s@href="/http@href="http@g'
Или с perl
:
perl -pe 's|href="\K(?!http)|/|g'
Используя perl
's negative look-ahead RE operator.
Эта техника, вероятно, сработает :Используя подстановку процесса, отправлять в процесс только stderr
По сути, вы звоните:
exec > $some_file
используя подстановку процесса, вы можете сделать что-то вроде:
exec > >( while read line; do echo " stdout: $line"; done )
это означает, что весь стандартный вывод будет идти в этот файл, а не в терминал.