我有一个管道分隔的文件,按行读取文件并在每行中搜索未闭合的引号(“)并关闭它

我有一个管道分隔的文件,按行读取文件并在每行中搜索未闭合的引号(“)并关闭它

下面是一行,我需要用“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/\|"[^"|]*$/&"/

    如果最后一个字段缺少结束引号,则会添加它。

相关内容