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 diff
call 显示已添加 1,680 行并删除了 1,681 行。
这显然是一种痛苦,因为它使代码审查者很难发现一行差异。有没有办法让 sed 执行此删除而不影响文件中的其他行?
编辑:在 IntelliJ 中打开项目时,差异被正确识别为一行。此外,sed 似乎已将换行样式从 CRLF 更改为 LF(是的,我在 Windows 上)。这是否足以触发 git 中的所有行不同?
【问题讨论】:
您可以粘贴要修改的文件吗? 对不起,没有。它是机密的,但结构是这样的:<project><modules><module>MODULE_NAME</module></modules></project>
我很感兴趣,如果受影响的 1680 行仅是 <module>
行,或者可能是因为您使用的是 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 编码之间转换文件,请使用以下程序:dos2unix
、unix2dos
(我不知道您是否在 Windows 上安装了 bash,但它们通常是任何 Linux 发行版的一部分)。您可以使用 core.autocrlf
配置选项强制 Git 执行有关行尾的特定行为(但这很棘手)。
太好了,unix2dos
完美运行(在 Windows 上的 bash 中)!如果您将其添加到您的答案中,我会接受。以上是关于sed 删除影响文件中的所有行的主要内容,如果未能解决你的问题,请参考以下文章
OSX & SED - 删除文档目录中第 25 行之后的所有行