Изменить устройство вывода stdout / stderr

[^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.

0
08.05.2018, 07:36
1 ответ

Эта техника, вероятно, сработает :Используя подстановку процесса, отправлять в процесс только stderr

По сути, вы звоните:

exec > $some_file

используя подстановку процесса, вы можете сделать что-то вроде:

exec > >( while read line; do echo " stdout: $line"; done )

это означает, что весь стандартный вывод будет идти в этот файл, а не в терминал.

0
28.01.2020, 04:23

Теги

Похожие вопросы