Найти позицию совпадающего слова в строке в bash (не в позиции символа)

У меня есть строка вроде

Xckt VDD VSS sig[1] sig[2] sig[3] sig[4] sig[5] sig[6] CKT 

и я хочу найти положение sig [4] в строке. В этом случае он должен вернуть 7 . Мне нужен простой скрипт / один лайнер в bash, чтобы сделать то же самое. В случае повторного совпадения, если серийный номер всех вхождений совпадения в строке будет большим.

3 Solutions collect form web for “Найти позицию совпадающего слова в строке в bash (не в позиции символа)”

Вы можете сделать это с awk следующим образом:

 awk '{for(i=1;i<=NF;i++)if($i=="sig[4]")print i}' 

Это должно работать для вас даже в случае нескольких записей.

Если вам нужны все номера в одной строке, вы можете заменить print с помощью printf и соответствующим образом отрегулировать.

Вы можете сделать это с помощью perl , например, используя модуль List :: MoreUtils, как описано в [perl] Получить индексы совпадений в массиве

 perl -MList::MoreUtils=indexes -alne ' print $_+1 for indexes { $_ eq "sig[4]" } @F ' 

Тестирование с помощью данной строки ввода

 $ perl -MList::MoreUtils=indexes -alne ' print $_+1 for indexes { $_ eq "sig[4]" } @F ' <<< "Xckt VDD VSS sig[1] sig[2] sig[3] sig[4] sig[5] sig[6] CKT" 7 

и с линией, содержащей несколько экземпляров

 $ perl -MList::MoreUtils=indexes -alne ' print $_+1 for indexes { $_ eq "sig[4]" } @F ' <<< "Xckt VDD VSS sig[1] sig[2] sig[3] sig[4] sig[5] sig[6] sig[4] CKT" 7 10 

у спешки есть приятное однострочное решение ; вот простая функция bash, которая выводит все совпадения в строке:

 function pratappos() { target=$1; shift pos=1 while [[ $# -gt 0 ]] do [[ "$1" = "$target" ]] && echo $pos shift; ((++pos)) done unset target pos } 

Он обобщен для поиска любой строки в данном списке, поэтому, например, вы должны настроить эту функцию (в вашем .bashrc или в текущую оболочку), а затем вызвать ее так:

 pratappos sig[4] Xckt VDD VSS sig[1] sig[2] sig[3] sig[4] sig[5] sig[6] CKT 7 

или (два совпадения):

 pratappos sig[4] Xckt VDD VSS sig[1] sig[2] sig[3] sig[4] sig[5] sig[6] CKT sig[4] 7 11 

… где первый параметр, который вы передаете ему, берется как строка, которую вы хотите найти, за которой следует остальная часть строки для поиска. Она определяет положение аргументов с использованием shift , который будет видеть вашу указанную строку разделенных $ IFS.

Чтобы прояснить предыдущий момент:

 pratappos 'foo bar' ab foo bar 'foo bar' rest here 5 
  • Как добавить ассоциативный массив к переменной из внешнего INI-файла?
  • Массивы в Unix Bourne Shell
  • Назначение команды массиву в сценарии оболочки не работает?
  • Bash - многомерные массивы и извлечение переменных из вывода
  • Разбиение в awk не на печать значений массива
  • Как динамически читать переменные из stdin и хранить их в массиве
  • bash: предопределить память для массива
  • Как запустить цикл for за 5 месяцев?
  • Попытка подделать двумерный многомерный массив в bash, сохранив имя массива в виде строки
  • Проблема фильтрации массива последовательностей для удаления дубликатов со сдвинутыми последовательностями
  • Удалить массив в awk
  • Linux и Unix - лучшая ОС в мире.