Я не уверен, является ли это точным выводом, который Вы ищете, но вероятно самый легкий путь:
grep -o '[0-9]\{12\}' file2 | sed 's/.*/^&$/' > /tmp/numpatterns.grep
grep -vf /tmp/numpatterns.grep file1 > file3
rm -f /tmp/numpatterns.grep
Вы могли также использовать:
sed -ne '/.*\([0-9]\{12\}.*/^\1$/p' file2 > /tmp/numpatterns.grep
grep -vf /tmp/numpatterns.grep file1 > file3
rm -f /tmp/numpatterns.grep
Каждый из них создает временный файл шаблона, который используется для подбирания чисел из большого файла (file1
).
Так не пойдет. Как Вы говорите, обратные ссылки не работают за пределами s
команды.
Вы могли сделать это с awk или жемчуг с:
perl -pe 's{<script src="(.*?)">}{
local$/;open F,"<$1";"<script>".<F>}ge'
sed's GNU e
команда могла быть решением:
sed '
/<script src="/ {
s/.*<script src="\([^"]\+\)">.*/cat \1/
e
}
' index.html
e
выполнит содержание пространства шаблона как команда если без аргумента, поэтому перепишите подобранную строку как команду оболочки как cat js/foobar.js
добился бы цели. Вывод команды заменяет пространство шаблона.
<script src="foo"></script><a href="...">
,.*
соответствовал быfoo></script><a href="...
, в то время как.*?
(нежадная версия), только соответствуетfoo
. – Stéphane Chazelas 24.11.2012, 19:23perldoc perlre
. Это соответствует как можно меньше. Я был представлен жемчугом, но теперь найден во многих других regex синтаксисах на других языках. спасибо – Stéphane Chazelas 24.11.2012, 19:33