shell 如何用““分隔符分隔一行,但不包括用单引号括起来的字符串?

7gcisfzg  于 2023-02-24  发布在  Shell
关注(0)|答案(3)|浏览(136)

这是我的第一篇文章,所以请原谅我,如果我错过了任何细节。
问题陈述:我在文件中有很多这样的行。字段之间用空格分隔。
'Temp.200.200B.Y2K & K-102 & P-503B.SP' (tp9012ga-bt102-734b-pqm4-kjk94kj10), PASSED, 2023-02-12T06:39:48Z, 2023-02-12T07:25:48.044Z, 1440] took 99ms including network delay.
我想保留什么是在单引号,也打破了这些领域与""分隔符。所需的输出如下。
'Temp.200.200B.Y2K & K-102 & P-503B.SP' (tp9012ga-bt102-734b-pqm4-kjk94kj10), 2023-02-12T06:39:48Z, 2023-02-12T07:25:48.044Z, 99
现在请记住,单引号内的字符变化很大,但它们总是封装在单引号内。
我尝试过使用空格分隔符进行剪切,但是它也会考虑单引号内字符串中的空格。cut -d\' -f1-6
此外,如果您注意到我想要的输出,我还想删除一些字段和一些字符,如'ms'从99ms。

gdrx4gfi

gdrx4gfi1#

如何用""分隔符分隔一行,但不包括用单引号括起来的字符串?
我将按照以下方式利用GNU AWK完成此任务,考虑以下简单示例,让file.txt内容为

fields without quotes
'quoted field' 'another quoted field' 'yet another field'
mixed 'quoted field' unquoted

那么

awk 'BEGIN{FPAT="\047[^\047]*\047|[^ ]*"}{print "1st field is",$1; print "2nd field is",$2; print "3rd field is",$3}' file.txt

给出输出

1st field is fields
2nd field is without
3rd field is quotes
1st field is 'quoted field'
2nd field is 'another quoted field'
3rd field is 'yet another field'
1st field is mixed
2nd field is 'quoted field'
3rd field is unquoted

说明:我使用FPAT来通知GNU AWK字段的组成,即单引号(因为'用作终止符,所以我使用\047,它是该字符的八进制ASCII代码)后跟零个或更多个非引号,后跟单引号或(|)零个或更多个非空格字符。免责声明:该解决方案假设'是完全平衡的,并且在非终止的引用字段内从不存在'

  • (在GNU Awk 5.0.1中测试)*
jvidinwx

jvidinwx2#

这可能对您有用(GNU sed):

sed -E 's/'\''[^'\'']*'\''|\S+/&\n/g
        s/.*/echo "&"|sed -n "1,2p;4,5p;8s#ms##p"/e
        s/\n//g' file

在空格分隔符前添加换行符。
使用substitution命令中的求值,再次调用sed并将每个字段视为一行。
删除或修改行(字段)。
删除插入的换行符。

sqougxex

sqougxex3#

通过查看问题陈述和所需的输出,您可能需要使用,作为分隔符,并使用awksed的组合。
在本例中,我将简单地回显您的 * PROBLEM STATEMENT * 字符串,以向您展示如何执行此操作。
我假设行格式在您的文件中是相同的(除了,外,引号内的字符变化很大,没有问题)

echo "'Temp.200.200B.Y2K & K-102 & P-503B.SP' (tp9012ga-bt102-734b-pqm4-kjk94kj10), PASSED, 2023-02-12T06:39:48Z, 2023-02-12T07:25:48.044Z, 1440] took 99ms including network delay." | awk -F "," '{print $1,","$3","$4","$5}' | sed -e 's/ms .*//g' -e 's/[0-9]*] took //g'
    • 输出:**
'Temp.200.200B.Y2K & K-102 & P-503B.SP' (tp9012ga-bt102-734b-pqm4-kjk94kj10) , 2023-02-12T06:39:48Z, 2023-02-12T07:25:48.044Z, 99
    • 编辑:**

@Ed Morton-我试过你的方法了,你是对的。它也只能用awk来完成。命令如下。

echo "'Temp.200.200B.Y2K & K-102 & P-503B.SP' (tp9012ga-bt102-734b-pqm4-kjk94kj10), PASSED, 2023-02-12T06:39:48Z, 2023-02-12T07:25:48.044Z, 1440] took 99ms including network delay." | awk -F "," '{ gsub("[0-9]*] took ","",$5); gsub("ms .*","",$5); print $1,","$3","$4","$5}'

相关问题