Если ваш Linux tar не поддерживает параметр -z
, вы можете использовать следующее:
tar -cvf - dir | gzip > dir.tar.gz
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
в качестве разделителя записей, и мы печатаем только четные записи.