Как найти шаблон и заменить его по-другому? - PullRequest
0 голосов
/ 27 октября 2010

У меня проблемы с удалением повторяющихся строк в файле и заменой их на неповторяющуюся строку.В идеале я хотел бы просто заменить его непрерывной последовательностью, чтобы дублированные строки могли быть разделены.

Я рассматривал sed с каким-то подстановочным знаком (*):

sed -e "s/text_pattern/text_pattern*/g" my_file.txt

Так что новый номер добавляется в text_pattern каждый раз, когда возвращается.Тем не менее, я не смог найти правильного решения на страницах руководства и в Интернете.У кого-нибудь есть идеи, как сделать что-то подобное?Возможно, sed не лучший выбор?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 28 октября 2010

Я не верю, что sed - это инструмент для этого.Если вам нужны регулярные выражения для подобных задач, вы можете использовать perl (который основан на awk и sed).

cat test | perl -e '$i = 1; while (<>) { chomp($_); if (s/pattern/pattern$i/) { $i++ }; print $_."\n"; }'

То есть для каждой строки в stdin: удалите новую строку, затем добавьте счетчик к шаблону, если вы его найдете.И, если вы найдете его, увеличьте его на 1. Затем напечатайте строку.

РЕДАКТИРОВАТЬ: test - это ваш входной файл.

0 голосов
/ 28 октября 2010

uniq

  • uniq -c input.txt показывает частоту появления.
  • uniq -u input.txt печатает уникальные строки.

awk

  • awk 'x[$0]++' input.txt печатает дубликаты строк.
  • awk '!x[$0]++' input.txt удаляет дубликаты строк.

sed

  • sed '$!N; /^\(.*\)\n\1$/P; D' input.txt печатает дубликаты строк.
  • sed '$!N; /^\(.*\)\n\1$/!P; D' input.txt удаляет дубликаты строк.
0 голосов
/ 27 октября 2010

Awk кажется более подходящим для этой задачи. Я предполагаю, что вам не нужно регулярное выражение, но вы хотите сопоставить всю строку с фиксированной строкой. Тогда вы можете сделать это:

awk -v ln="text_pattern" '$0 == ln { $0 = $0 " " ++i };1' my_file.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...