我们有一个价值
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/'
该模式取决于末尾的两个双引号字符串。这样它就会显示两个中的第一个(或者完整字符串中倒数第二个双引号子字符串)。
更新:随着echo
OP似乎想要...
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