如何组合以下两个sed命令。
一个循环目录中的所有文件,并从中删除第一行。 另一个从文件行的开头删除任何双引号。
删除每个文件的第一行
for each in `/bin/ls -1`;do sed -i 1d $each;done
行的开头
for each in `/bin/ls -1`;do sed -i 's/^"//g' $each;done
答案 0 :(得分:5)
你可以这样做:
for each in *; do sed -i.bak 's/^"//g; 1d' "$each"; done
答案 1 :(得分:4)
您可以使用-e
在同一行中执行不同的sed
命令:sed -e 'command_1' -e 'command_2' ... -e 'command_n'
。您也可以使用sed 'command_1; command_2; ...; command_n
。
让我们使用第一个选项并循环浏览文件:
for file in *
do
sed -i.bak -e '1d' -e 's/^"//' "$file"
done
另请注意,我使用for file in *
,以便*
扩展到当前目录中的文件。这比解析ls
的输出更好(Why you shouldn't parse the output of ls(1)是一个很好的读取)。
最后,正如anubhava建议的那样,在使用-i
时创建备份文件是一个好习惯。这样,你总是在安全的一面:)
答案 2 :(得分:4)
您可以将它们放入sed的相同调用中:
for f in *; do sed -i '1d;s/^"//' "$f"; done
除了组合两个sed命令之外,我还使用了一个glob *
而不是尝试解析ls,这绝不是一个好主意。
此外,您的替换不必是全局的,因为根据定义它只能应用于每一行,所以我也删除了g
修饰符。
答案 3 :(得分:4)
您可以通过以下方式使用单个命令执行此操作:
sed -i.bak --separate '1d ; s/^"//' *
使用--separate
你告诉sed单独处理文件,默认是将它们作为一个长文件进行处理,但你在第一个命令中使用地址(1
)所以默认不起作用。
'1d ; s/^"//'
只是将两个命令组合在一起(由;
分隔)。