Как мне добавить серийный номер, начинающийся с 141, после каждого знака решетки?

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 в качестве разделителя записей, и мы печатаем только четные записи.

2
20.02.2017, 01:28
2 ответа

Хотя это технически возможно с помощью sed (это полный Тьюринг) , это очень сложно, потому что в sed нет арифметики. Это работа для awk.

Если вы хотите заменить только первый # в каждой строке, просто скажите ему заменить # на # с последующим увеличивающимся числом. Awk автоматически преобразует целые числа в их десятичное представление в виде строк.

awk -v n=141 '/#/ {sub(/#/, "#" (++n))}'

Если вы хотите заменить каждый символ # , самый простой способ - сделать # разделителем полей и добавить число в начале каждого поля, кроме первого:

awk -v n=141 -F '#' '{for (i=2; i<=NF; i++) $i = (++n) $i}'
2
27.01.2020, 22:10
< yourfile perl -slpe 's/#/$&.$k++/e' -- -k=141

также можно использовать для редактирования.

0
27.01.2020, 22:10

Теги

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