【问题标题】:Sed Insert Multiple Linessed 插入多行
【发布时间】:2012-09-04 03:48:42
【问题描述】:

我正在尝试使用 sed 进行插入(刚刚阅读过它)并且我试图插入多行而被难住了?

我目前正在做的是:

sed -i "${line} i\
        /* Name - ID */ \
        select  @ID = NULL \
        from    Animals \
        where   VrsnID = @VrsnID \
        and     Request= \"Request\" \
 \
" animalNames.txt

注意echo $line == 131

新问题

所有内容都出现在输出中的一行? (也缺少第一个缩进)

/* Name - ID */        select  @ID = NULL         from    Animals         where   VrsnID = @VrsnID         and     Request= "Request"

已解决

但这会引发:

sed: -e expression #1, char 47: unknown command: `
'

知道为什么吗?

感谢您的宝贵时间

【问题讨论】:

  • 您使用哪个版本的 sed ? GNU/BSD ?
  • GNU 抱歉没有意识到这会造成差异
  • 在这里工作,GNU sed 版本 4.2.1
  • 我不确定我做了什么改变,但它现在可以工作,但一切都在一条线上?

标签: shell sed


【解决方案1】:

在 shell 脚本中,反斜杠+换行符扩展为空。这是一种在字符串中实际上没有换行符的情况下继续下一行的方法。所以 sed 看到的只是一条大线。比较:

$ echo "foo\
> bar"
foobar
$ echo "foo
> bar"
foo
bar

您需要向 sed 传递一个反斜杠和一个换行符,因此通过在反斜杠前面加上另一个反斜杠来转义它。

sed -i "${line} i\\
        /* Name - ID */ \\
        select  @ID = NULL \\
        from    Animals \\
        where   VrsnID = @VrsnID \\
        and     Request= \"Request\" \\

" animalNames.txt

如果您将标准输入上的脚本作为here document 传递,这可能更具可读性。您需要保留展开以替换 ${line},因此您仍然需要将反斜杠加倍。

sed -i -f - animalNames.txt <<EOF
${line} i\\
        /* Name - ID */ \\
        select  @ID = NULL \\
        from    Animals \\
        where   VrsnID = @VrsnID \\
        and     Request= "Request" \\

EOF

【讨论】:

  • 感谢 Gilles 提供的所有进一步信息!
  • heredoc 版本+1。正在努力使内联命令与包含各种重要元字符和引号的多行一起工作。这种方法第一次效果很好,而且更干净,所以我以后会去。
【解决方案2】:

对于新的麻烦: 使用双反斜杠\\

【讨论】:

  • 太棒了,谢谢你,为什么我在谷歌的任何地方都找不到这个(必须搜索 20 多次“sed 多行插入”)
  • 因为多行最好使用AWK。 (在我看来)
  • 附带说明,是否可以读取文件以在 sed 命令中插入“内容”而不是 C&P?
  • @PezCuckow :是的,带有-f 参数。可以制作sed的脚本文件。
  • 另一个注意事项 - 请记住,这与 MacOSX 中的 sed 不同。
【解决方案3】:

这可能对你有用:

sed ${line}'i\
    /* Name - ID */ \
    select  @ID = NULL \
    from    Animals \
    where   VrsnID = @VrsnID \
    and     Request= \"Request\"

' animalNames.txt

【讨论】:

  • 你需要使用 \\ 换行
  • @PezCuckow 对我来说(使用 GNU sed 和 bash)一个 \ 就足够了。
猜你喜欢
  • 1970-01-01
  • 2014-10-27
  • 2017-03-10
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 2021-12-13
  • 2023-03-26
相关资源
最近更新 更多