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

23276
dnkb

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

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

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

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

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

9

2 ответа на вопрос

12
mrucci

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

sed 's/old/new/2' file 

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

sed 's/ /|/2' 

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

From the `sed` info file: *"Note: the POSIX standard does not specify what should happen when you mix the `g' and NUMBER modifiers, and currently there is no widely agreed upon meaning across `sed' implementations. For GNU `sed', the interaction is defined to be: ignore matches before the NUMBERth, and then match and replace all matches from the NUMBERth on."* Dennis Williamson 13 лет назад 2
Info files... I hate them. Anyway, I removed the ambiguous part. Good comment, +1. mrucci 13 лет назад 0
Спасибо, Муччи и Деннис. Я думал, что там должно быть что-то простое. dnkb 13 лет назад 0
Кажется, все проблемы с манипуляциями с текстом, которые мне удается решить с помощью `sed`. Я не уверен, что должен поблагодарить вас за то, что вы сделали `sed` еще более полезным для меня, но я все равно это сделаю. ;) Jamie 11 лет назад 0
1
petersohn

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

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

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

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