gpt4 book ai didi

awk - zsh - 有效地在数组中缓存带引号的字符串

转载 作者:行者123 更新时间:2023-12-04 09:43:58 26 4
gpt4 key购买 nike

我正在尝试在文件中查找带引号的字符串。有时,这些字符串可能包含特殊字符,包括斜线引号(例如\")。

在 macOS Catalina 上使用 zsh 命令(gnu sed,而不是 bsd;虽然 awk 等也很好),我将这些值缓存在数组中的最有效方法是什么?

样本输入:

a file that contains...

The "quick" "\(brown)" fox
jumps "over \n\"the $?@%\"" fence

预期输出:
the array below...

echo -E - ${array[@]}
"quick" "\(brown)" "over \n\"the $?@%\""

编辑

我愿意放弃高效的部分,只专注于可行的事情。

此外,我并不是要给任何人戴上手铐,使其使用 awk 或 sed。该脚本需要能够在 vanilla macOS 系统上运行,任何可用的命令都可以。

编辑

所以这就是我目前所处的位置......
while read line; do 
echo -E - $line | sed 's/\\*(/\\\(/g' | awk -F\" '{print $2}'
done < SampleInput

...输出:
quick
over n

在这一点上,我需要修复两件事来打印我将存储在数组中的值:

(1) 我需要保留特殊字符。

(2) 我需要保留的不仅仅是第二个字段。认为我需要在忽略转义引号的同时计算引号,然后每隔一个字段打印一次。

从那里开始,使用 xargs 将这些打印的字段加载到数组中应该不难弄清楚。

最近有一些其他类似的问题,所以我认为保留特殊字符是可能的;跳过所有其他领域是丑陋的。

最终我会得到这个,但我会感谢任何更了解这些命令的人的帮助。

提前致谢。

最佳答案

这是对 awk 的尝试但它需要更多的测试,我只测试了样本输入。

> cat test.awk

BEGIN { RS="\"" }
p { printf "%s", $0 }
($0 ~ /\\$/) { if (p) { printf "%s", "\"" }; next }
{ if (p) { p=0 } else { p=1; printf "\n" } }
p是打印模式和 RS是双引号。如果发现转义双引号,我们不会切换打印模式,这意味着记录以反冲结尾。
> cat file
The "quick" "\(brown)" fox
jumps "over \n\"the $?@%\"" fence
> awk -f test.awk file

quick
\(brown)
over \n\"the $?@%\"

关于awk - zsh - 有效地在数组中缓存带引号的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62205323/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com