【问题标题】:combine two sed commands [duplicate]结合两个 sed 命令 [重复]
【发布时间】:2015-01-30 16:11:22
【问题描述】:

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

【问题讨论】:

    标签: regex bash unix sed command-line


    【解决方案1】:

    您可以使用-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 时创建备份文件是一个好习惯。这样,您总是安全的 :)

    【讨论】:

    • 我实际上是要删除我的答案,因为你先回答了更多细节+1
    【解决方案2】:

    你可以这样做:

    for each in *; do sed -i.bak 's/^"//g; 1d' "$each"; done
    

    【讨论】:

    • 是的,创建备份文件是个好习惯。为它 +1。
    • 我借给你.bak +1
    【解决方案3】:

    您可以像这样将它们放入同一个 sed 调用中:

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

    除了结合两个 sed 命令之外,我还使用了 glob * 而不是尝试解析 ls,这绝不是一个好主意。

    另外,您的替换不必是全局的,因为根据定义它只能应用于每一行一次,所以我也删除了 g 修饰符。

    【讨论】:

    • 有点不公平,其他答案有 3 个赞成票,而你的只有 1 个。我已经赞成,但我会再次赞成,因为它很有解释性。
    • 我想这是我在第一次编辑中写完整答案而不是玩游戏所付出的代价。没关系!
    • 第一次编辑时写完整的解释+1
    【解决方案4】:

    您可以通过以下方式使用单个命令来完成:

    sed -i.bak --separate '1d ; s/^"//' *
    

    说明

    使用--separate,您告诉 sed 单独处理文件,默认情况下将它们作为一个长的单个文件处理,但您使用的是地址(第一个命令中的1),因此默认值不起作用.

    '1d ; s/^"//' 只是组合了两个命令(以; 分隔)。

    【讨论】:

    • 不知道这个 gnu --separate 选项 +1
    猜你喜欢
    • 2011-12-01
    • 2015-01-29
    • 2012-06-05
    • 2014-08-21
    • 1970-01-01
    • 2014-08-22
    • 2015-11-13
    • 1970-01-01
    • 2017-01-01
    相关资源
    最近更新 更多