用于获取引号中完整单词的命令

用于获取引号中完整单词的命令

我们有一个价值

XX_EMAIL_GL_BTCH_ATTACH FCP_REQID=8830260 FCP_LOGIN="APPS/pwd" FCP_USERID=4807 FCP_USERNAME="USER" FCP_PRINTER="noprint" FCP_SAVE_OUT=Y FCP_NUM_COPIES=1 "XX WBP 8-501 Misc Receipts" "[email protected]"

我们需要获取值XX WBP 8-501 Misc Receipts

我们尝试如下,但它只返回 XX。

echo XX_EMAIL_GL_BTCH_ATTACH FCP_REQID=8830260 FCP_LOGIN="APPS/pwd" FCP_USERID=4807 FCP_USERNAME="USER" FCP_PRINTER="noprint" FCP_SAVE_OUT=Y FCP_NUM_COPIES=1 "XX WBP 8-501 Misc Receipts" "[email protected]" | cut -d" " -f9 | sed 's/"//g'

答案1

按照您的模式,您只需添加一些列即可cut

cut -d' ' -f9-13 | sed 's/"//g'

您还可以使用纯sed解决方案:

sed 's/.*"\(.*\)" ".*"$/\1/'

该模式取决于末尾的两个双引号字符串。这样它就会显示两个中的第一个(或者完整字符串中倒数第二个双引号子字符串)。

更新:随着echoOP似乎想要...

echo 'XX_EMAIL_GL_BTCH_ATTACH FCP_REQID=8830260 FCP_LOGIN="APPS/pwd" FCP_USERID=4807 FCP_USERNAME="USER" FCP_PRINTER="noprint" FCP_SAVE_OUT=Y FCP_NUM_COPIES=1 "XX WBP 8-501 Misc Receipts" "[email protected]"' | sed 's/.*"\(.*\)" ".*"$/\1/'

答案2

请注意,按照您输入字符串的方式echo,shell 会吃掉双引号,因此您无法知道第九个字段的长度。您需要先用单引号将字符串引起来。

然后你必须考虑到cut只是寻找空格作为分隔符,并且不知道如何忽略引号内的空格,所以这样做:

echo 'XX_EMAIL_GL_BTCH_ATTACH FCP_REQID=8830260 FCP_LOGIN="APPS/pwd" FCP_USERID=4807 FCP_USERNAME="USER" FCP_PRINTER="noprint" FCP_SAVE_OUT=Y FCP_NUM_COPIES=1 "XX WBP 8-501 Misc Receipts" "[email protected]"' | cut -d" " -f9- | cut -d\" -f 2

第一个cut保留从第九个字段开始的所有内容,第二个"作为分隔符仅保留第一对引号内的部分。

使用 puresed也可以完成相同的操作

sed -E 's/([^ ]* ){8}//;s/"//;s/".*//'

无论如何,如果您要向前面的列字段添加空格,则可能会破坏脚本。

答案3

cut提取时使用不会获得可靠的解决方案逻辑来自此类输入的子字符串。

使用以下固溶体之一:

1)Python命令(简化):

python -c 'import csv,sys; r=csv.reader(sys.stdin, delimiter=" "); print(next(r)[8])' <file

Python数据集模块 id 非常适合读写表格数据。


2)GNUawk命令:

awk -v FPAT='"[^"]+"|[^"]+' '{ gsub("\"","",$8); print $8 }' file

输出为两个都方法:

XX WBP 8-501 Misc Receipts

相关内容