Как извлечь строку между двумя \n в файле

Если ваш Linux tar не поддерживает параметр -z , вы можете использовать следующее:

tar -cvf - dir | gzip > dir.tar.gz
7
24.07.2016, 23:36
1 ответ

Grep интерпретирует \n как символ новой строки. Похоже, что в вашем файле нет символов новой строки, а есть \, за которым следует n. Для поиска литеральных обратных слешей их нужно удвоить:

$ grep -o '\\n[^\\]*\\n' o.txt
\n29\n
\n3 days\n
\n59\n
\n7 days\n
\n99\n
\n12 days\n

С помощью GNU grep вывод можно легко очистить, чтобы удалить \n:

$ grep -oP '(?<=\\n)[^\\<>]*(?=\\n)' o.txt
29
3 days
59
7 days
99
12 days

Здесь, (? <=\\\n) - это утверждение с оглядкой, а (?=\\\n) - утверждение с оглядкой, требующее, чтобы текст, который мы подбираем, был окружен \n. Хотя grep возвращает непересекающиеся совпадения, тонкость здесь в том, что look-behinds и look-aheads not учитываются в совпадении. Это оставляет нас с проблемой, что текст, который нам не нужен, также окружен \n. Например, в o.txt символы \n
\n
окружены \n. Чтобы исключить эти строки, мы требуем, чтобы совпадающий текст исключал не только \, но и < и >.

Если у нас нет GNU grep, другой вариант - использовать sed для очистки вывода:

$ grep -o '\\n[^\\]*\\n' o.txt | sed 's/\\n//g'
29
3 days
59
7 days
99
12 days

Другой вариант - использовать awk:

$ awk '0==NR%2' RS='\\\\n' o.txt
29
3 days
59
7 days
99
12 days

Здесь awk использует \, за которым следует n в качестве разделителя записей, и мы печатаем только четные записи.

9
27.01.2020, 20:17

Теги

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