sed 不贪婪匹配

sed 不贪婪匹配

我相信 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因为您不依赖行号,并且不需要扩展的正则表达式支持。

相关内容