linux - 当从另一个 sed 命令通过管道传输时,sed 不工作

标签 linux bash sed

我正在尝试为 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

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

最佳答案

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

$ 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

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

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

关于linux - 当从另一个 sed 命令通过管道传输时,sed 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54455661/

相关文章:

multithreading - 从一个脚本在两台不同的计算机上同时运行两个 bash 命令

bash - 如何在 Bash 变量中存储大括号

shell - 如何在 shell 中的两列之间插入不同的分隔符

linux - 多行 sed 表达式不起作用

sed 脚本删除所有字符,包括一行中的第二个逗号

c++ - 文件名如何在 `char` 和 2 字节字符之间工作?

linux - 在 Linux 上使用 sendmail 将邮件消息保存为文件

linux - 如何将一个文件的尾部与另一个文件的头部结合起来?

c - 将已经分配的内存映射到共享内存

bash - 将 "-I"标志添加到 bash 中的路径字符串