下面是一行,我需要用“20”关闭“20”
2019-02-15T10:25:19+0100|ttt|werewrw|erewr|fddsfsdf|dfsdf|07|2ee7|1b65d04|"20|19|-02-|15t10:03|45435435|765767||SIP;rr=200;text="hyt"|
答案1
让我们将此作为测试文件:
$ cat text
start|10|"20|end
"10"|"20|"30"|end
"20|"10|"30|end
abc|def|"20"|30|"end
要关闭所有打开的"
,请尝试:
$ sed -E 's/^("[^"|]*)\|/\1"|/; :a; s/(\|"[^"|]*)\|/\1"|/g; ta; s/\|"[^"|]*$/&"/' text
start|10|"20"|end
"10"|"20"|"30"|end
"20"|"10"|"30"|end
abc|def|"20"|30|"end"
怎么运行的
如果未闭合引号可以出现在第一个字段、中间字段或结束字段中,则需要考虑三种情况。因此,我们有三个替代命令:
s/^("[^"|]*)\|/\1"|/
如果该行以引号开头,但第一个引号之前没有出现引号
|
,则会添加引号。:a; s/(\|"[^"|]*)\|/\1"|/g; ta;
如果中间字段缺少引号,则会添加它。为了确保添加所有此类缺失的引号,将重复替换命令,直到不再进行任何更改。
s/\|"[^"|]*$/&"/
如果最后一个字段缺少结束引号,则会添加它。