为什么sed在接收多个文件作为输入时只处理一个文件?

时间:2018-04-12 14:02:11

标签: macos sed

我想用sed操作六个CSV文件

sed -i -e "1d" 1.csv 2.csv 3.csv 4.csv 5.csv 6.csv

sed -i -e "1d" *csv

但是当运行任何这些命令时,仅修改1.csv。但是,sed将2-6.csv的原始文件(备份文件的时间戳保持不变)重命名为2.csv-e,依此类推并创建一个新文件2.csv,但这个新文件与2.csv-相同e(和diff:ing 2.csv和2.csv-e没有返回差异)(diffing 1.csv和1.csv-e列出了一些变化)。

如何让sed接受多个文件作为输入?

这是在OS X上。

3 个答案:

答案 0 :(得分:3)

格伦的答案是大多数人最好和理想的答案。还有一个 GNU Parallel 的替代方案,看起来更像是您在问题中尝试提出的命令,并且并行运行6份sed(或您想要的任何其他内容) :

parallel sed -i -e 1d ::: *.csv

要非常小心,因为它可能会非常快速地同时修改很多东西。当你熟悉它时,你应该添加两个标志,即--dry-run,这样它什么也不做,只显示它会做什么,-k保持输出顺序。因此,更安全的运行方式如下 - 包括对我们处理的文件更具选择性:

parallel --dry-run -k sed -i -e 1d ::: {1..6}.csv

<强>输出

sed -i -e 1d 1.csv
sed -i -e 1d 2.csv
sed -i -e 1d 3.csv
sed -i -e 1d 4.csv
sed -i -e 1d 5.csv
sed -i -e 1d 6.csv

GNU Parallel 最容易安装在带有 homebrew 的macOS上:

brew install parallel

答案 1 :(得分:2)

OSX sed man page

  

Sed地址

     
    

不需要地址,但如果指定必须是数字(累计计算输入行          跨输入文件),一个美元(``$&#39;&#39;)字符,用于处理最后一行输入或上下文          地址(由一个前缀和后跟分隔符的正则表达式组成)。

  

所以,你需要一个不同的方法

for file in 1.csv 2.csv 3.csv 4.csv 5.csv 6.csv; do
    sed -i -e "1d" "$file"
done

答案 2 :(得分:1)

使用GNU-sed,您可以使用-s:

 sed -i.bak -se  "1d" {1..6}.csv 

({1..6}构造至少在bash中起作用。)

sed的联机帮助页说:

   -s, --separate

          consider files as separate rather than as a single continuous long stream.

它适用于我,包括就地命令和.bak文件的生成。但我不知道MacOS。首先尝试使用testdata或阅读手册页。