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

Awk zsh-高效地在数组中缓存带引号的字符串,awk,sed,zsh,Awk,Sed,Zsh,我试图在文件中查找带引号的字符串。有时,这些字符串可能具有特殊字符,包括斜杠引号(例如“\”) 在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 - ${

我试图在文件中查找带引号的字符串。有时,这些字符串可能具有特殊字符,包括斜杠引号(例如“\”)

在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上。脚本需要能够在香草macOS系统上运行,任何可用的命令都可以

编辑

这就是我现在的位置

while read line; do 
    echo -E - $line | sed 's/\\*(/\\\(/g' | awk -F\" '{print $2}'
done < SampleInput 
在这一点上,我需要解决两个问题来打印我将存储在数组中的值:

(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 $?@%\"
这可能适用于您(GNU-sed):

sed调用将
文件
中的每一行缩进,删除任何非单词(字符串不被双引号包围),并在识别的单词后放置一个换行符。因此
文件1
的每一行将包含一个双引号单词,而不是它的双引号


注意:regexp忽略了
\

后面的任何字符。我非常怀疑
sed
awk
,或者任何普通的命令行工具是否能够解析任意的Swift代码。@chepner我编写的脚本可以随时处理Swift代码。它只是一个像其他任何文件一样包含文本的文件。另外,这个问题是适用于任何带有特殊字符的文本,不需要很快。这种方法正是我要寻找的,但当我在示例输入上运行此命令时,它会删除所有字符。@Mercutio-hmm..请参阅演示。太棒了!我可以使用它
> cat file
The "quick" "\(brown)" fox
jumps "over \n\"the $?@%\"" fence
> awk -f test.awk file

quick
\(brown)
over \n\"the $?@%\"
sed -E 's/^[^"]*"([^"\]*(\\.[^"\]*)*)" */\1\n/;/^[^\n]*\n/P;D' file > file1