Sed从文件中删除第一行

时间:2017-12-09 20:07:52

标签: bash shell sed terminal bsd

如果文件以 uuid 开头,我想删除文件夹中所有文件的第一行,因此我有一个工作sed命令,如下所示:

$ sed -i '' '/^uuid/d' *

工作正常并删除所有以 uuid 开头的行。

现在我想通过仅删除第一行来改进脚本,如果它以 uuid 开头,因为某些文件有多个 uuid:s 且只有一个应删除第一行。所以现在我改进了命令,看起来像这样:

$ sed -i '' '1{/^uuid/d;}' *

现在这个命令也可以工作,但只能在文件夹中的第一个文件上运行,即使我运行一个简单的(只删除第一行)版本,如:

$ sed -i '' '1d' *

它仍然只影响第一个文件。

为什么会这样?

我在Mac上(因此我已经了解了sed的BSD版本),我也尝试通过Brew,$ brew install gnu-sed --with-default-names安装gnu-sed版本,但没有运气。

我已阅读sed - 25 examples to delete a line or pattern in a filesed - 20 examples to remove / delete characters from a file并用Google搜索sed delete first line in files

更新1:正如john1024的评论中所建议的,我已使用-s选项进行了测试,但不确定如何使用它。

$ sed -s '1d' ./* sed: illegal option -- s

当我检查man sed时,我可以找到-s & --seperate选项,所以我必须在这里做错事。

更新2:好的,进度... find . -iname '*.yml' -exec sed -i '' -e '1{/uuid/d;}' {} \;可以解决这个问题,但我收到错误消息sed: can't read : No such file or directory

感谢您提供任何帮助或指导!

:OLA

1 个答案:

答案 0 :(得分:3)

sed -i '' '1{/^uuid/d;}' *只会修改第一个文件, 因为行号在文件中累计计算, 所以"第1行"只发生一次,它是第一个文件的第一行。 要对多个文件的第一行执行某些操作, 您需要为每个文件运行sed一次。

您可以使用简单的for循环执行此操作:

for f in *; do sed -i '' '1{/^uuid/d;}' "$f"; done