sed 删除影响文件中的所有行

Posted

技术标签:

【中文标题】sed 删除影响文件中的所有行【英文标题】:Sed deletion affecting all lines in file 【发布时间】:2018-07-18 23:03:06 【问题描述】:

免责声明:我对 sed 的经验很少。

我正在尝试通过使用 bash 脚本自动执行一项有些繁琐的任务,其中一个步骤是从 Maven pom.xml 文件中删除一行,我正在尝试使用以下 sed命令:

sed -i '/<module>'"$MODULE_NAME"'<\/module>/d' ./pom.xml

它似乎工作正常。问题是 pom 的所有行都受此影响,因为 git diffcall 显示已添加 1,680 行并删除了 1,681 行。

这显然是一种痛苦,因为它使代码审查者很难发现一行差异。有没有办法让 sed 执行此删除而不影响文件中的其他行?

编辑:在 IntelliJ 中打开项目时,差异被正确识别为一行。此外,sed 似乎已将换行样式从 CRLF 更改为 LF(是的,我在 Windows 上)。这是否足以触发 git 中的所有行不同?

【问题讨论】:

您可以粘贴要修改的文件吗? 对不起,没有。它是机密的,但结构是这样的:&lt;project&gt;&lt;modules&gt;&lt;module&gt;MODULE_NAME&lt;/module&gt;&lt;/modules&gt;&lt;/project&gt; 我很感兴趣,如果受影响的 1680 行仅是 &lt;module&gt; 行,或者可能是因为您使用的是 Windows 而导致的问题,并且您的脚本以某种方式更改了行尾,或者您对行尾配置了错误的 git,等 sed 没有任何关系。这是一个 Git 问题。 不是sed 改变了文件中的行尾吗?还是您的意思是 Git 将不同的行尾视为文件中的差异是 Git 问题? 【参考方案1】:
$ git diff --ignore-space-at-eol

编辑

为避免意外换行,您可以将 Git 配置为使用core.autocrlf 自动更改行结尾或使用unix2dos 程序修复sed 之后的文件。

【讨论】:

这是在本地完成的!这显然是一个行尾问题。话虽如此,该文件仍然在远程存储库中显示为在提交后具有 1680 行差异,因为远程文件也具有 CRLF 行结尾。截至目前,我的快速修复是在替换行后执行此命令:sed -i 's/$'"/echo \\\r/" ./pom.xml 在提交之前恢复为 CRLF 行结尾。我很乐意提出改进建议。 要在不需要 sed 的 unix 和 dos 编码之间转换文件,请使用以下程序:dos2unixunix2dos(我不知道您是否在 Windows 上安装了 bash,但它们通常是任何 Linux 发行版的一部分)。您可以使用 core.autocrlf 配置选项强制 Git 执行有关行尾的特定行为(但这很棘手)。 太好了,unix2dos 完美运行(在 Windows 上的 bash 中)!如果您将其添加到您的答案中,我会接受。

以上是关于sed 删除影响文件中的所有行的主要内容,如果未能解决你的问题,请参考以下文章

OSX & SED - 删除文档目录中第 25 行之后的所有行

删除文件中与模式不匹配的行

sed删除包含指定字符串的所有行

sed删除怎么生效

bash 中的行删除问题:将用户输入传递给 sed 与 grep?

sed简单使用选择性删除