Замените подобранный путь к файлу содержанием файла в пути с sed

Я не уверен, является ли это точным выводом, который Вы ищете, но вероятно самый легкий путь:

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).

5
24.11.2012, 18:30
2 ответа

Так не пойдет. Как Вы говорите, обратные ссылки не работают за пределами s команды.

Вы могли сделать это с awk или жемчуг с:

perl -pe 's{<script src="(.*?)">}{
  local$/;open F,"<$1";"<script>".<F>}ge'
3
27.01.2020, 20:39
  • 1
    Большой Спасибо!, Хотя, почему Вы помещали? после.* –  Rovanion 24.11.2012, 19:15
  • 2
    В <script src="foo"></script><a href="...">, .* соответствовал бы foo></script><a href="..., в то время как .*? (нежадная версия), только соответствует foo. –  Stéphane Chazelas 24.11.2012, 19:23
  • 3
    я никогда не встречался с нежадным.*, прежде чем так как sed не будет поддерживать его. Есть ли документация для, когда нежадный.* остановки? –  Rovanion 24.11.2012, 19:28
  • 4
    Посмотрите perldoc perlre. Это соответствует как можно меньше. Я был представлен жемчугом, но теперь найден во многих других regex синтаксисах на других языках. спасибо –  Stéphane Chazelas 24.11.2012, 19:33

sed's GNU e команда могла быть решением:

sed '
/<script src="/ {
  s/.*<script src="\([^"]\+\)">.*/cat \1/
  e
  }
' index.html

e выполнит содержание пространства шаблона как команда если без аргумента, поэтому перепишите подобранную строку как команду оболочки как cat js/foobar.js добился бы цели. Вывод команды заменяет пространство шаблона.

3
27.01.2020, 20:39

Теги

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