Заменить каждый второй экземпляр слова в каждой строке файла - PullRequest
1 голос
/ 21 октября 2019

Я пытаюсь заменить каждое второе слово экземпляра каждой строки на sed.

Например: Если бы у меня была строка, как показано ниже

i_ref_clk i_ref_clk i_ait_rstn i_ait_rstn abc kiran/def

следует заменить, как показано ниже.

i_ref_clk kiran/i_ref_clk i_ait_rstn kiran/i_ait_rstn abc def kiran/def

Только второй экземпляр слова заменен на kiran/.

Моя попытка:

echo " i_ref_clk i_ref_clk i_ait_rstn i_ait_rstn abc def def" | sed 's/ / kiran\//2'

Вывод:

i_ref_clk kiran/i_ref_clk i_ait_rstn i_ait_rstn abc def def

Мой вопрос:

Пожалуйста, помогите мне с правильным sed или любым Linuxкоманда, которая выполняет вышеуказанную работу.

Ответы [ 2 ]

2 голосов
/ 21 октября 2019

Не могли бы вы попробовать следующее, если вы в порядке с awk.

awk -v var="kiran/" '{for(i=1;i<=NF;i++){if(++a[$i]==2){$i=var $i}};delete a} 1' Input_file

Или добавлением формы не-одного вкладыша вышеуказанного решения:

awk -v var="kiran/" '
{
  for(i=1;i<=NF;i++){
    if(++a[$i]==2){
      $i=var $i
    }
  }
  delete a
}
1
'   Input_file

Вывод дляПоказанный образец будет выглядеть следующим образом.

i_ref_clk kiran/i_ref_clk i_ait_rstn kiran/i_ait_rstn abc kiran/def
1 голос
/ 21 октября 2019

С GNU sed

$ line='i_ref_clk i_ref_clk i_ait_rstn i_ait_rstn abc def def'
$ echo "$line" | sed -E 's|\b(\w+)\b(.*)\b\1\b|\1\2kiran/\1|g'
i_ref_clk kiran/i_ref_clk i_ait_rstn kiran/i_ait_rstn abc def kiran/def
  • \b(\w+)\b захватить целое слово (\b - границы слова и \w соответствует любому символу слова)
  • (.*) любое количество символов
  • \b\1\b совпадает с тем же целым словом, которое соответствует первой группе захвата
  • \1\2kiran/\1 в разделе замены, при необходимости добавьте текст
  • обратите внимание, что | используется в качестве разделителя, если он не будет конфликтовать с вводимыми символами и предполагает, что слово повторяется только дважды
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...