Мне нужно отсканировать файл с множеством различных специальных символов и значений. Учитывая набор специальных символов - мне нужно указать значение рядом с ним:
547 %$
236 \"
4523 &*
8876 (*
8756 "/
...
Я использую команду awk с gsub, чтобы найти последовательности как они есть.
awk -v st="$match_string" 'BEGIN {gsub(/(\[|\]|\-|\$|\*|\:|\+|\"|\(|\))/,"\\\\&", st)} match($0,st) {print;exit}' file.txt
Команда отлично работает, например,
> (*
>> 8876 (*
Однако у меня возникают проблемы с использованием команды для поиска последовательности \ "Я пытаюсь добавить в gsub различные строки, чтобы представить последовательность:
|\\|
|\\\\|
|\\\\"|
...
Но результат всегда:
> \"
>> 8756 "/
, в то время как результат, который я ищу, может быть:
> \"
>> 236 \"
Кажется, что gsub не работает, и \ "интерпретируется так же, как" Любые идеи?
. Это короткий скрипт для запуска - - он должен найти символ, присоединенный к значению в first_num - Далее он должен напечатать первое значение в файле, связанном с Обнаружен символ
first_num=$1
echo "looking for : $first_num"
sym_to_check=$(awk -v s="$first_num" '$0~s {if ($0~s)print $2}' temp.txt)
echo "symbol - $sym_to_check"
first_val=$(awk -v s="$sym_to_check" 'BEGIN {gsub(/(\[|\]|\-|\$|\^|\*|\:|\+|\"|\(|\))/,"\\\\&",s)} $0~s {if ($0~s)print; if ($0~s)exit}' temp.txt)
echo "first val- $first_val"
Предположим, что txt-файл:
547 %$
111 [*
222 ()
5655 (*
454 )"
35 #!
743 \"
657 #!
236 \"
4523 &*
8876 (*
456 \"
8756 "/
Первый запуск в порядке:
> bash temp1.sh 8876
looking for : 8876
symbol - (*
first val- 5655 (*
скрипт находит первое значение, прикрепленное к (* но следующий прогон плох:
> bash temp1.sh 236
looking for : 236
symbol - \"
first val- 454 )"
символ кор rect - ищет \ ", но при поиске первого значения, прикрепленного к нему, он ищет первый символ с" Это дает значение 454) "вместо желаемых 743 \"