Для неупомянутого примера, каждого \\
пара передает одну обратную косую черту grep, таким образом, 4 обратных косых черты передают два grep, который переводит в единственную обратную косую черту. 6 обратных косых черт передают три grep, переводя в одну обратную косую черту и один \c
, который равен c
. Одна дополнительная обратная косая черта ничего не изменяет, потому что она переводится \c
-> c
оболочкой. Восемь обратных косых черт в оболочке четыре в grep, переведенном в два, таким образом, это больше не соответствует.
Для примера в двойных кавычках отметьте то, что следует за Вашей второй кавычкой из страницы справочника удара:
Обратная косая черта сохраняет свое особое значение только при сопровождении одним из следующих символов: $'", \, или новая строка.
Т.е. когда Вы даете нечетное число обратных косых черт, концов последовательности в \c
, который был бы равен c
в неупомянутом случае, но при заключении в кавычки обратная косая черта освобождает свое особое значение, таким образом, \c
передается grep. Именно поэтому диапазон "возможных" обратных косых черт (т.е. те, которые составляют сопоставление с образцом Ваш файл в качестве примера) скатывается одним.
Я более доволен awk, таким образом, я хотел бы представить два решения в awk.
$ echo abc,10.11.13.14,def,1.2.3.4,geh,6.7.54.23 | awk -F, '{for (i=1; i<NF; i+=2) if ($i == "def") print $(i+1)}'
1.2.3.4
В этом случае я ищу название машины "определение", если найдено, распечатайте следующий столбец.
$ echo abc,10.11.13.14,def,1.2.3.4,geh,6.7.54.23 | tr , \\n | awk '/def/ {getline;print}'
1.2.3.4
В этом решении я использую tr
управляйте, чтобы преобразовать запятые в новую строку, поиск "определения" и распечатать строку, которая следует. Я надеюсь что эти решения работа для Вас.
Принятие Вас имеет GNU grep с совместимыми с Perl регулярными выражениями:
device="def"
grep -oP '(?<=\b'"$device"',).*?(?=,|$)'
Что означает: найдите содержание между "определением" на одной стороне и "запятой или концом строки" на другом
Править: добавленный граница слова к РЕ для нахождения данного устройства более точно.
Не используя команды, но оболочки builtins:
string='abc,10.11.13.14,def,1.2.3.4,geh,6.7.54.23'
dev=def
s=,$string,
case $s in
(*,"$dev",*) ip=${s#*",$dev,"}; ip=${ip%%,*};;
(*) ip=unknown
esac
printf '%s\n' "$ip"
С zsh легко отобразить ту строку на ассоциативный массив:
string='abc,10.11.13.14,def,1.2.3.4,geh,6.7.54.23'
typeset -A ip
ip=(${(s:,:)string})
print -r -- $ip[def]
Используя grep (GNU) и сокращение:
$ echo abc,10.11.13.14,def,1.2.3.4,geh,6.7.54.23 | grep -o 'abc,[^,]*' | cut -d, -f2
10.11.13.14
Замените каждым IP-адресом [0-9\.]\{7,15\}
использование sed. IP-адрес состоит из чисел и точек, варьирующихся от 7 до 15 положений.
Замените каждый IP-адрес собой сопровождаемый новой строкой \n
, который в основном означает, что каждое устройство, комбинация IP будет иметь свою собственную строку.
echo "abc,10.11.13.14,def,1.2.3.4,geh,6.7.54.23" | sed 's/\([0-9\.]\{7,15\}\),/\1\n/g'
abc,10.11.13.14
def,1.2.3.4
geh,6.7.54.23
echo "abc,10.11.13.14,def,1.2.3.4,geh,6.7.54.23" | sed 's/\([0-9\.]\{7,15\}\),/\1\n/g' | grep def
def,1.2.3.4