【问题标题】:Bash - sed, replace line nr 1 in all matched filesBash - sed,替换所有匹配文件中的第 nr 1 行
【发布时间】:2017-06-01 07:08:41
【问题描述】:

我有一个包含许多不同文件夹的目录。在这些是一些 php 文件。我需要在所有这些文件夹中更改与某个字符串匹配的所有文件中的第 nr 1 行。

我需要更改的所有文件都在第 1 行:<?php some text><?php

我需要用“<?php”替换所有第一行

我试过这个:

grep -rl something /somedir/folder/ | xargs sed -i '' '1s/.*/<?php/

但它只替换第一个文件夹中的一个文件。

我也试过了:

grep -rnw something /somedir/folder/ | xargs sed -i '' '1s/.*/<?php/

然后我得到这个错误:

sed: /somedir/folder//1.php:1:<?php: No such file or directory

知道如何解决这个问题吗?

【问题讨论】:

  • 删除空字符串后,您的解决方案可以正常工作。请参阅我的(经过测试的)答案。

标签: bash macos sed


【解决方案1】:
sed -i -e 's/<\?php.*<\?php/<?php/' `find ./ -type f`

解释一下:

sed -i

运行,使用 sed 就地编辑

-e 's/

替换命令,替换

<\?php.*<\?php

两个连续的php开头语句(转义问号,因为这是一个正则表达式)

/

<?php

一个php开场白

/' 

每行一次。

`find ./ -type f`

对于这个文件夹中的所有内容都是一个文件。

【讨论】:

  • 感谢您的解释。但是,当我运行它时,所发生的只是我得到一个“>”,我的标记被放置在其中,就像它正在等待输入一样。我在我的 Mac 上运行终端,我不知道这是否相关。
  • 我的错 - 我正在与 SO 语法作斗争,以使那里的命令不被转义,我不小心在那里留下了一个反斜杠。删除它。请重试。
  • 这会搜索孔文件。替换第一行的一种非常低效的方法。
  • @ceving 这样任何人将其用作类似更改的模板都不会想知道为什么只更改了第一行。此外,在几乎所有情况下,您搜索文件所花费的时间都比 sed 实际花费的时间要多得多……另外请注意,我并没有将 find 限制为 PHP 文件。
【解决方案2】:
find ./ -iname "*.php" -exec sed '1 s/^<?php some text><?php$/<?php/' -i {} \; 

【讨论】:

  • 虽然这段代码 sn-p 可以解决问题,包括说明 如何为什么 这解决了问题 would really help 以改进你的帖子质量。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人!请edit您的答案添加解释,并说明适用的限制和假设。
  • 我试过这个。它确实找到了所有文件,但它不会替换第 nr 1 行。似乎将文件保留在原来的位置。
【解决方案3】:

执行 sed 时,我不知道空字符串的意图是什么。没有它对我来说完全没问题:

grep -rl something /somedir/folder/ | xargs sed -i '1s/.*/<\?php/'

【讨论】:

  • 当我在没有空字符串的情况下运行它时,我得到“无效的命令代码 V”。我在我的 Mac 上使用终端,我不知道这是否与它有关。
  • 好吧,我在 Linux 上测试了它,因为你用 Linux 标记了你的问题。我不知道 Mac 版本有何不同或是否不同,但空字符串根本没有意义,因为 '' 不是真正的字符串,单引号用于转义。
  • 也许它会有所帮助,当您发布您尝试完全的内容时,因为您发布的命令中没有V。因此,有了这个错误信息,我们只能猜测,出了什么问题。
  • 好的,这正是我尝试过的:grep -rl fepm3hopmA /Users/Vega/Desktop/test-files/ | xargs sed -i '1s/.*/&lt;\?php/'
【解决方案4】:
grep -rl something /somedir/folder/ | xargs sed -i '' '1s/.*/<\?php/'

这类作品。但它只会更改它首先找到的文件。而不是所有的文件。所以基本上有了这个,如果我有 100 个文件,我将不得不运行它 100 次 =)

知道如何解决这个问题吗?

【讨论】:

    【解决方案5】:

    我找到了解决方案。现在,由于我在 OSX 上,显然 sed 的工作方式与在 Linux 上的工作方式不同。我不知道。但这是可以做到的:

    find ./ -name \*.php -exec sed -i '' -e '1s/.*/<?php/' {} \;
    

    我不明白为什么需要这样,但它确实有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      相关资源
      最近更新 更多