结合两个sed命令

时间:2014-12-02 12:03:19

标签: bash unix command-line sed

如何组合以下两个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

4 个答案:

答案 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/^"//'只是将两个命令组合在一起(由;分隔)。