Я не вижу решения с grep
, но sed
является альтернативой awk
.С sed
я хотел бы видеть шаблоны типа b/foo/.*
в 1.txt, но я покажу решение на основе (.*)
.
Целью первой команды является создание конструкций sed
, которые будутзамените строку ввода регулярным выражением, если оно совпадает с регулярным выражением.Различные выходные строки должны выглядеть следующим образом:
sed -rn 's#b/c/(.*)#b/c/#p' 2.txt
, и это можно сделать с помощью
# Use subprocess
sed 's/\(.*\)\(([.][*])\)/s#\1\2#\1#p/' 1.txt
# resulting in
sed -rnf <(sed 's/\(.*\)\(([.][*])\)/s#\1\2#\1#p/' 1.txt) 2.txt| sort -u
Решение немного сложное для чтения, что вызвало bij макет 1.txt, гдеЯ хотел бы строки как b/foo/.*
.
Вышеуказанные команды будут иметь 2 ошибки:
Когда совпадение находится на части строки, несоответствующая часть будет показана в выходных данных.Это можно исправить с помощью сопоставления мусора
# Use lines like 's#.*b/foo(.*)#b/foo#p'
sed -rnf <(sed 's/\(.*\)\(([.][*])\)/s#.*\1\2#\1#p/' 1.txt) 2.txt| sort -u
Вторая ошибка заключается в том, что строки в 2.txt
, имеющие два совпадения, будут сопоставляться только один раз (первое совпадение будет редактировать строку в потоке).
Это можно исправить, добавив некоторый уникальный маркер (я буду использовать \a
) для совпадающих строк и повторив строки ввода на выходе (с \n&
).Вывод можно просмотреть, выполнив поиск маркеров \a
.
sed -rnf <(sed 's/\(.*\)\(([.][*])\)/s#.*\1\2#\\a\1\\n\&#p/' 1.txt) 2.txt|
sed -rn '/\a/ s/.(.*)/\1/p' | sort -u
РЕДАКТИРОВАТЬ:
Обход с маркером и восстановление исходного ввода не требуется, если вы придерживаетесь другого подхода.
В sed
вы можете распечатать что-то на стандартный вывод без изменения потока.
Одна из возможностей (медленная для этой ситуации) - использовать
sed '/something/ eecho "something" '
Другая возможность - использовать команду "x" (который обменивает пространство образца с буфером удержания).Вы действительно хотите иметь сценарий sed
с такими командами, как
\%a/% {h;s%.*%a/%p;x}
\%b/% {h;s%.*%b/%p;x}
\%b/c/% {h;s%.*%b/c/%p;x}
\%b/foo/% {h;s%.*%b/foo/%p;x}
\%d/% {h;s%.*%d/%p;x}
\%e/% {h;s%.*%e/%p;x}
. При использовании вышеуказанного метода решение sed
упрощается до
sed -nf <(
sed 's#([.][*])##; s#.*#\\%&% {h;s%.*%&%p;x} #' 1.txt
) 2.txt | sort -u
Когда файл 1.txt не изменяетсячасто вам может понадобиться предварительно обработать этот файл.
sed 's#([.][*])##; s#.*#\\%&% {h;s%.*%&%p;x} #' 1.txt > /tmp/sed.in
sed -nf /tmp/sed.in 2.txt | sort -u