#bash #sed #gsub
#bash #sed #gsub
Вопрос:
У меня есть test1.txt
файл с большим количеством строк с разной информацией. Среди них некоторые строки содержат такую информацию:
Fam_grapsidae
Fam_bursidae
Fam_siluridae
Я хочу изменить Fam_*
into italic{*}
, чтобы иметь в test2.txt
:
italic{grapsidae}
italic{bursidae}
italic{siluridae}
Итак, я попытался с sed
:
sed 's/Fam_*/italic{*}/g' test1.txt > test2.txt
Но я получил это:
italic{*}grapsidae
Итак, как я могу интегрировать звездочки в sed
команду, чтобы иметь italic{grapsidae}
выражение?
Любые советы приветствуются.
Комментарии:
1.
*
escape i t2. @KamilCuk на самом деле нет, OP не ищет литерал
*
; когда он говорит: «Я хочу изменить Fam_* на курсив {*}»*
, это относится к переменным частям текста.
Ответ №1:
То, что вы хотите, это:
sed 's/Fam_(.*)/italic{1}/' test1.txt > test2.txt
Комментарии:
1. Да, это называется захватом. Большинство вариантов регулярных выражений позволяют записывать до 9 шаблонов, которые можно вызвать с помощью последовательностей
1
—9
в шаблоне замены.
Ответ №2:
Необходимо использовать extended regex
-E
опцию by, чтобы иметь возможность вернуть ее после первого захвата в группе
sed -E 's/Fam_(w*)/italic{1}/' test1.txt > test2.txt
Комментарии:
1.
-E
влияет на то, как вы захватываете текст, а не на то, как вы извлекаете захваченный текст, и вам это не нужно для захвата текста. Кроме того, большинство sed не поймут, чтоw
означает (только GNU sed?), Так что YMMV с использованием этого.