заменить n-й вхождение строки в каждой строке текстового файла
23317
dnkb
У меня есть большие текстовые файлы с разделителями пробелами (2-5). Строки могут содержать «» или «-». Я хотел бы заменить, скажем, второе пространство с трубкой.
Какой лучший путь?
Используя sed, я думал об этом:
sed -r 's/(^[a-z'-]+ [a-z'-]+\b) /\1|/' filename.txt
Любые другие / лучшие / более простые идеи?
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 14 лет назад
2
Info files... I hate them. Anyway, I removed the ambiguous part. Good comment, +1.
mrucci 14 лет назад
0
Спасибо, Муччи и Деннис. Я думал, что там должно быть что-то простое.
dnkb 14 лет назад
0
Кажется, все проблемы с манипуляциями с текстом, которые мне удается решить с помощью `sed`. Я не уверен, что должен поблагодарить вас за то, что вы сделали `sed` еще более полезным для меня, но я все равно это сделаю. ;)
Jamie 12 лет назад
0
1
petersohn
Вы пробовали свою версию? Это сработало? Потому что я думаю, что это хорошая идея. Я бы сделал немного по-другому, хотя:
sed -re 's/^([^ ]+ +[^ ]+) /\1|/'
Это примет любые символы в слове, которое не является пробелом, и примет более одного пробела между первыми двумя словами.