Я пытаюсь дублировать строки в текстовом файле, которые содержат определенные специальные символы, но в дубликате заменить специальный символ на "обычные" символы ASCII. Конкретный вариант использования - символы с ударением.
Вход:
éva
test
frédéric
Желаемый результат:
éva
eva
test
frédéric
frederic
На данный момент я могу продублировать строки, содержащие é
символ, но я не уверен, как искать и заменять в группе захвата.
Вот что у меня получилось на данный момент:
echo 'éva\ntest\nfrédéric' | sed 's/\(.*é.*\)/&\n\1/'
Могу ли я сделать это с sed
? Если нет, я буду рад поработать с awk
...
решение1
Вы можете сопоставить é
и затем применить несколько команд:
sed '/é/{p;s/é/e/g;}'
Для любой строки é
, содержащей , выводится текущее пространство шаблонов, затем все é
s заменяются на e
(и снова выводится пространство шаблонов).
Эквивалент AWK:
awk '/é/{print; gsub(/é/, "e")}1'
sed
Команда s
может повторно использовать шаблон адреса:
sed '/é/{p;s//e/g;}'
а если все ваши замены состоят из одного символа, то y
команда будет более эффективной:
sed '/é/{p;y/é/e/;}'
решение2
$ awk '1; gsub(/é/,"e")' file
éva
eva
test
frédéric
frederic
Вышеуказанные применения:
- Идиоматическое истинное условие,
1
заставляющее awk выполнить действие по умолчанию — вывести текущую строку, затем: gsub()
для замены любогоé
s наe
s, и если это нашло/заменило любойé
s, то его положительный возврат, используемый в контексте условия, снова заставляет awk выполнить действие по умолчанию — вывести текущую (теперь измененную) строку.
Обратите внимание, что использование кода возврата для gsub()
сообщения о том, é
были ли найдены какие-либо символы s, избавляет нас от необходимости дважды указывать одно и то же регулярное выражение /é/
в команде.
решение3
Еще один sed
вариант - вдохновленный@EdMorton's awk
ответ
sed -n 'p;s/é/e/gp' file
решение4
Другой вариант,похоже на @Stephen Kitt's:
$ sed '/é/p;s/é/e/g'
éva
eva
test
frédéric
frederic
/é/p
выберите строки, содержащиеé
символ, и распечатайте.s/é/e/g
вывести предыдущие строки с заменой.