【发布时间】:2020-04-27 09:53:53
【问题描述】:
我需要扫描具有许多不同特殊字符和值的文件。 给定一组特殊字符 - 我需要在它旁边提供值:
547 %$
236 \"
4523 &*
8876 (*
8756 "/
...
我正在使用带有 gsub 的 awk 命令来按原样查找序列。
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 )"
符号是正确的 - 寻找 \" 但是在搜索附加到它的第一个值时,它会寻找第一个带有 " 的符号 这给出了值 454 )" 而不是所需的 743 \"
【问题讨论】:
-
哪些输入有效,哪些无效?提供您正在测试的输入和预期的输出
-
诸如 \" 之类的序列不起作用 - 它们被翻译成 "
-
好的,我们知道了,提供一个我们可以轻松复制粘贴并继续工作的示例
-
I see到目前为止,您尚未接受任何问题的答案。请阅读stackoverflow.com/help/someone-answers。
标签: awk