【问题标题】:Sed deletion affecting all lines in filesed 删除影响文件中的所有行
【发布时间】:2024-07-16 02:10:01
【问题描述】:

免责声明:我对 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 问题?

标签: bash git sed pom.xml


【解决方案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 中)!如果您将其添加到您的答案中,我会接受。
最近更新 更多