Фильтрация указанных c строк в одном файле на основе другого файла в оболочке - PullRequest
0 голосов
/ 20 марта 2020

Представьте себе, что у вас есть эти два файла:

Первый:

# foo
http://some.url/
# bar
http://foo.url/
# bar
http://and.one.more/url

Второй:

foo
doo

Теперь я хочу напечатать из первого файла эти строки которые начинаются с # и содержат слова из Второго файла - и не только эти строки, но и те URL, которые следуют за совпавшими строками.

Сначала мне показалось, что я могу использовать grep:

grep -f Second -A 1 First

Но, конечно, это была ошибка:

# foo
http://some.url/
--
http://foo.url/
# bar

Итак, мой вопрос: как я могу ограничить фильтрацию только теми строками, которые начинаются с #? И после нахождения таких строк распечатайте их, а также следующую строку после них. Было бы здорово, если бы это можно было сделать с помощью некоторых стандартных инструментов, таких как grep, sed или awk.

. Желаемым результатом для этого самого примера будет:

# foo
http://some.url/

РЕДАКТИРОВАТЬ: Извините, что беспокою вас всех, в моем конкретном случае я решил просто временно объединить строки, затем к grep -f Second First, а затем разделить получившиеся строки обратно на печать.

Ответы [ 3 ]

2 голосов
/ 20 марта 2020

sed при замене процесса будет работать:

grep -A1 -Fwf <(sed 's/^/# /' second) first
# foo
http://some.url/
2 голосов
/ 20 марта 2020

Вы можете использовать подстановку процесса, чтобы поставить перед каждой строкой в ​​файле ^#, добавить $ и использовать это в качестве аргумента -f для grep.

grep -f <(sed 's/.*/^# &$/' Second) -A 1 First
0 голосов
/ 20 марта 2020

Самый простой способ, которым я могу придумать, это сначала дать себе несколько ярлыков в обоих файлах.

Файл A: -

#----------+foo----------
# foo
http://some.url/
#----------.foo----------

Файл B: -

#----------+foo----------
doo
#----------.foo----------

Теперь вы можете просто сделать: -

#!/bin/sh

sed -n "/+foo/,/.foo/" filea.txt >> newfile.txt
sed -n "/+foo/,/.foo/" fileb.txt >> newfile.txt

cat > edpop+.txt << EOF
4,5d
wq
EOF

ed -s newfile.txt < edpop+.txt

Это избавит от двух средних полос, как только вы соберете текст в один файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...