【问题标题】:Sed delete first line from filessed 从文件中删除第一行
【发布时间】:2018-05-23 18:44:56
【问题描述】:

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

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

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

现在我想通过仅删除以 uuid 开头的第一行来改进脚本,因为某些文件有多个 uuid:s 并且只有一个应该删除第一行。所以现在我将命令改进为如下所示:

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

现在这个命令也有效,但只适用于文件夹中的第一个文件,即使我运行一个简单的(只是删除第一行)版本,比如:

$ sed -i '' '1d' *

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

这是为什么?

我在 Mac 上(所以我理解的是 sed 的 BSD 版本),我还尝试通过 Brew 安装 gnu-sed 版本,$ brew install gnu-sed --with-default-names,但没有成功。

我读过sed - 25 examples to delete a line or pattern in a filesed - 20 examples to remove / delete characters from a file 和谷歌搜索 sed delete first line in files

更新 1: 正如 john1024 在 cmets 中提出的那样,我已经使用 -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

感谢您的帮助或指导!

:奥拉

【问题讨论】:

  • 为了在 GNU sed (Linux) 上解决这个问题,可以使用-s 选项告诉 sed 将“文件视为单独的而不是单个连续的长流”。熟悉 BSD sed 的人必须告诉您 Mac 上是否有类似的选项。
  • bsd sed 不支持 -s switch 似乎是公知的秘密,所以其他小伙伴建议要么使用一种循环来处理所有文件(即find ...... |sed find ... -exec sed)。你也可以试试foldername/*./*,你可能会很幸运。 ...forums.freebsd.org/threads/50187 和这里stackoverflow.com/questions/19590980/…
  • 好的,所以我尝试了find ./ -iname '*.yml' | sed -e '1{/^uuid/d;}'ls *.yml | sed -e '1{/^uuid/d;}' 两者都只产生目录中未更改的文件列表。
  • 我不确定为什么需要-i ''sed -i -e ... 对我来说效果很好
  • @PhilippGrigoryev -i '' 对于 BSD sed 是必需的,但对于 GNU sed 则不需要。

标签: bash shell sed terminal bsd


【解决方案1】:

sed -i '' '1{/^uuid/d;}' * 只会修改第一个文件, 因为行号是跨文件累积计算的, 所以“第 1 行”只出现一次,它是第一个文件的第一行。 对多个文件的第一行做一些事情, 您需要为每个文件运行一次sed

您可以使用简单的for 循环来做到这一点:

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

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多