заменить n-й вхождение строки в каждой строке текстового файла


15

У меня большие текстовые файлы с разделителями пробелами (2-5). Строки могут содержать «» или «-». Я хотел бы заменить, скажем, второе пространство на трубу.

Какой лучший путь?

Используя sed, я думал об этом:

sed -r 's/(^[a-z'-]+ [a-z'-]+\b) /\1|/' filename.txt

Любые другие / лучшие / простые идеи?

Ответы:


22

Вы можете добавить число в конце команды замены. Например, следующее заменит второе вхождение oldсо строкой newв каждой строке file:

sed 's/old/new/2' file

Итак, вместо предложенного вами решения вы можете использовать:

sed 's/ /|/2'

Для получения дополнительной информации см., Например, этот учебник sed .


2
Из sedинформационного файла: «Примечание: стандарт POSIX не определяет, что должно происходить при смешивании реализаций g' and NUMBER modifiers, and currently there is no widely agreed upon meaning across sed». Для GNU «sed» взаимодействие определяется следующим образом: игнорировать совпадения до NUMBERth, а затем сопоставлять и заменять все спички от NUMBERth на ".
Приостановлено до дальнейшего уведомления.

Инфо файлы ... Я их ненавижу. Во всяком случае, я удалил неоднозначную часть. Хороший комментарий, +1.
mrucci

1
Спасибо, Муччи и Деннис. Я думал, что там должно быть что-то простое.
dnkb

Кажется, что все проблемы, с которыми я сталкиваюсь при работе с текстом, мне удается решить sed. Я не уверен, что должен был бы поблагодарить вас за то, что вы стали для sedменя еще более полезными, но я все равно это сделаю. ;)
Джейми

1

Вы пробовали свою версию? Это сработало? Потому что я думаю, что это в основном хорошая идея. Я бы сделал немного по-другому, хотя:

sed -re 's/^([^ ]+ +[^ ]+) /\1|/'

Это примет любые символы в слове, которое не является пробелом, и примет более одного пробела между первыми двумя словами.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.