我相信 sed 无法进行非贪婪匹配。有没有办法让 sed 不匹配换行符?
我按如下方式使用 sed,但后者 (.*) 按预期匹配所有内容,但也匹配不需要的新行。
sed -i -s -r 's|^([A-Za-z0-9*()])(.*)|INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "\1\2", "" )|' /path/to/files/*
我得到的输出是
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "Some text
", "" )
答案1
如果我的输入文件之一看起来像
Abba
Ebbo
Obbe
...那么您的命令预计会将其修改为
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "Abba", "" )
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "Ebbo", "" )
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "Obbe", "" )
但是,如果您的输入文件是带有 CRLF 行结尾的 DOS 文本文件,则尾随回车符将导致结果显示为
", "" )INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "Abba
", "" )INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "Ebbo
", "" )INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "Obbe
...如果文件是在 Unix 系统上处理的。
这是由于终端解释时回车符将光标移回行首。
这实际的在这种情况下,数据是(用\r
符号表示回车符)
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "Abba\r", "" )
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "Ebbo\r", "" )
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "Obbe\r", "" )
要解决此问题,请将输入文件从 DOS 文本文件转换为 Unix 文本文件。这可以使用诸如 之类的工具批量完成dos2unix
,或者您也可以将其作为sed
命令的一部分来完成:
sed -i \
-e 's/[[:space:]]$//' \
-e 's/^[[:alnum:]*()].*/INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "&", "" )/' files
第一个表达式从每行末尾删除一个类似空格的字符(回车符是其中之一),第二个表达式执行替换。
请注意,不需要 和-s
,-r
因为您不依赖行号,并且不需要扩展的正则表达式支持。