我有这样的文件(奇数行和偶数行有不同的类型内容):
try to upload UI/uploaded/2010.png
[{"index":"1","field":"file","exloc":"MiVip/07fb"}]
try to upload UI/uploaded/2011.png
[{"index":"1","field":"file","exloc":"MiVip/0487"}]
我想得到的是:
2010.png
MiVip/07fb
2011.png
MiVip/0487
此外,我希望将结果输出到一个数组中(以供后一个代码使用)。 我想使用bash(awk,sed可以在需要时使用)来做到这一点。
当我使用awk时,我无法找出正确的正则表达式 字段分隔符(我想使用,空格:“[] {和}用于字段分隔符,所以最后一个字段将是我想要的)。 最好的答案是为awk提供正确的分隔符。
或者回退到sed(将所有的,“[] {}替换为空格。”
答案 0 :(得分:3)
简单明了:
sed -e '/^try to upload/s=.*/==; /^\[/{s=.*"exloc":"==;s="}\]==}'
它使用所谓的“地址”,因此它转换为:如果该行以“尝试上传”开头,请删除最后一个斜杠的所有内容。如果该行以[
开头,请移除"exloc":"
以外的所有内容,并移除尾随的"}]
。
答案 1 :(得分:2)
试试这个awk单行:
awk '{c=$0~/\]$/?split($0,a,/"/)-1:split($0,a,/\//);print a[c]}' file
输入示例,输出:
kent$ awk '{c=$0~/\]$/?split($0,a,/"/)-1:split($0,a,/\//);print a[c]}' file
2010.png
MiVip/07fbde4d3abe340e22703f96494bf61e215995e3d
2011.png
MiVip/048734395a6442854877102d8f0a16ae4f642eaf8
这种方法使用了awk的split()
函数。它会检查输入中每一行的最后一个字符,如果它以]
结尾,与"
分开,并打印array[len-1]
,否则我们会与/
分开,数组中的最后一个元素。
如果您的输入的最后一个字符不应作为要检查的目标,您可以更改$0~/YourPattern/
以使该行适合您。