【问题标题】:sed isn't working when it's piped from another sed command当从另一个 sed 命令通过管道传输时,sed 不起作用
【发布时间】:2019-01-31 07:49:13
【问题描述】:

我正在尝试为 grep 表达式准备输出,但是当我尝试修改数据以获取我想要的格式时,我无法以我想要的方式获取它。

我正在使用以下命令来获取我需要的 IP 地址列表。

PRIV_IP=$(aws ec2 describe-instances  \
     --region "${REGION}" \
     --output text \
     --query 'Reservations[].Instances[].[PrivateIpAddress]' \
     --filters Name=tag:TagA,Values="${TagAData}" \
               Name=tag:TagB,Values="HOME" \
               Name=tag:TagC,Values="MAIN" | sed 's/\./-/g' | sed 's/ /\\|/g')

这是命令的输出;它会忽略最后一个 sed 语句。

echo $PRIV_IP
1-2-3-4 5-6-7-8 9-10-11-12

如果我手动执行 sed,它会按预期工作。

echo $PRIV_IP | sed 's/ /\\|/g'
1-2-3-4\|5-6-7-8\|9-10-11-12

有人可以就我做错了什么提供一些意见吗?

【问题讨论】:

  • aws ec2 describe-instances \ --region "${REGION}" \ --output text \ --query 'Reservations[].Instances[].[PrivateIpAddress]' \ --filters Name=tag:TagA,Values="${TagAData}" \ Name=tag:TagB,Values="HOME" \ Name=tag:TagC,Values="MAIN",sed之前的输出是什么
  • 只有 IP 带有 .'s 而不是 -'s 和它们之间的空格
  • 交换两个 sed 命令会发生什么?他们似乎并不相互依赖。或者,如果您将它们链接到一个命令中? sed -e 's/\./-/g' -e 's/ /\\|/g'?
  • 你试过s/[[:space:]]/\\|/g来替换空格吗?你确定这只是空格吗? IE。 hexdump 原始值
  • 仅供参考:对于多个表达式,您不需要多个 sed 命令。只需用; 将它们分开,例如sed -e 's/\./-/g;s/[[:space:]]/\\|/g'

标签: linux bash sed


【解决方案1】:

可能是您的真实命令打印了 TAB,但在您的测试中它们已经转换为空格,例如

$ echo -e "A\tB"
A       B
$ echo -e "A\tB" | sed -e 's/ /X/g'
A       B
$ a=$(echo -e "A\tB"); echo $a
A B
$ echo $a | sed -e 's/ /X/g')
AXB

解决方案:按照 cmets 的建议替换所有空格,即

$ echo -e "A\tB" | sed -e 's/[[:space:]]/X/g'
AXB

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 2018-09-14
    • 2017-12-13
    • 2016-07-25
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多