Как интегрировать звезду (*) в шаблон изменения в sed?

#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 t

2. @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 с использованием этого.