所以,免责声明:我是相当新的使用bash和zsh的,所以有机会的话,答案是非常简单的。 尽管如此。 我查了一下以前的贴子,但没有找到任何东西。 (编辑:我已经在这两个bash和zsh中shells-同样的问题,尝试这样做。)
我有很多文件的目录,我试图删除每一个文件的第一行。
所以说该目录包含:FILE1.TXT FILE2.TXT file3.txt ...等等。
我使用sed命令(非GNU):
sed -i -e "1d" *.txt
出于某种原因,这只是去掉第一个文件的第一行。 我认为,* .TXT会影响匹配的目录模式中的所有文件。 奇怪的是,创建与-e附加文件副本,但两者的重复和原来是一样的。
我想这与其他命令(如LS * .TXT),它工作正常。 是否有一些关于sed的我失踪?
先感谢您。
不同版本的sed
。在不同的操作系统都支持各种参数。
OpenBSD的(5.4)的sed
该-i
标志不可用。 您可以使用下面的/bin/sh
语法:
for i in *.txt
do
f=`mktemp -p .`
sed -e "1d" "${i}" > "${f}" && mv -- "${f}" "${i}"
done
FreeBSD的(11-CURRENT)的sed
该-i
标志需要一个扩展,即使它是空的。 因此,必须写成sed -i "" -e "1d" *.txt
GNU的sed
这看起来,看看下面的参数-i
是另一种选择(或可能的命令)。 如果是这样,它假定就地修改。 如果这似乎是一个文件扩展名,如“ .bak
”,将重命名原始的“ .bak
”,然后修改成原来的文件名。
可能有其他平台上的其他变化,但这些都是三我手边。
- 使用它没有-e!
一个文件的使用:
sed -i '1d' filename
所有文件的使用:
sed -i '1d' *.txt
要么
files=/path/to/files/*.extension ; for var in $files ; do sed -i '1d' $var ; done
。对于我,我使用Ubuntu和基于Debian的系统,这种方法为我工作100%,但对其他platformes我不知道,所以这是另一种方法:
替换emty图案第一线,并取出空行,(双命令):
在$文件(LS /path/to/files/*.txt); 做的sed -i “S / $(头-1 ”$文件“)// G” “$文件”; SED -i '/ ^ $ / d' “$文件”; DONE
注意:如果你的文件包含飞溅“/”,那么它会给错误,所以在这种情况下,sed的命令应该是这样的( sed -i "s[$(head -1 "$files")[[g"
)
希望这是你在找什么:)
这里的问题是,当sed的打开一个新的文件,所以行号没有被复位1
只有第一个文件的第一行相匹配。
一个解决方案是使用shell循环,为每个文件调用sed的一次。 Gumnos的回答显示了如何做到这一点的最广泛兼容的方式,但如果你有一个版本sed的支持-i
标志,你可以这样做,而不是:
for i in *.txt; do
sed -i.bak '1d' "$i"
done
它可以通过传递一个空后缀以避免创建备份文件,但就个人而言,我不认为这是一件坏事。 有一天,你会对此表示感谢!
看来,你不GNU工具工作,但如果你是,我会建议使用GNU AWK这项任务。 变量FNR
在这里很有用,因为它可以追踪每个文件的记录号的个人,可以让你做到这一点:
gawk -i inplace 'FNR>1' *.txt
使用inplace
延伸,这可以让你删除每个文件的第一行,只打印在线条FNR
大于1。
测试一下:
$ seq 5 > file1
$ seq 5 > file2
$ gawk -i inplace 'FNR>1' file1 file2
$ cat file1
2
3
4
5
$ cat file2
2
3
4
5
你传递给桑达最后一个参数是问题尝试这样的事情。
var=(`find *txt`)
for file in "${var[@]}"
do
sed -i -e 1d $file
done
这奏效了我。