在我的 bash 脚本中,我将有两个名为“args1”和“args2”的变量。他们每个人都会有这样的内容:
Matching cluster names:
[a-z]+
[a-z]+
...
所以“args1”可能是:
Matching cluster names:
dev1ff
dev2ff
和“args2”可能是:
Matching cluster names:
dev2ff
dev3ff
我需要结合这些来产生:
Matching cluster names:
dev1ff
dev2ff
dev3ff
我可以用这条线接近这一点:
echo "$(echo "$args1" | grep -v "^Matching") $(echo "$args2" | grep -v "^Matching")" | sort -u
这会产生大致如下所示的内容:
Matching clusters:
dev1ff
dev2ff dev3ff
实际名称无关紧要,但问题是我无法在第一块和第二块之间插入换行符。我在两个“$(...)”块之间的那个空间中尝试了几种变化,但没有任何效果。
由于命令替换删除了任何尾随换行符,因此您将获得两个命令替换之间的空格作为分隔它们的唯一内容。因此结果。
使用任何
echo
支持-e
,您可以使用而是在两者之间放置一个换行符。虽然如果您的数据有反斜杠,那也会
echo
转换它们。为避免这种情况,您可以printf
像这样使用:(格式字符串根据需要重复多次,因此使用两个参数,与 .
"%s\n"
的工作方式相同%s\n%s\n
。另外,您可能希望使用printf
而不是echo
无论如何,请参阅为什么 printf 比 echo 更好?)但是您实际上并不需要命令替换;
echo "$(something)"
接近something
直接运行。sort -u
您可以使用花括号对要定向的两个命令进行分组:或者,注意到两个 grep 都做同样的事情,将 grep 移到大括号之外:
在上述两个中,您可以将
echo
s 替换为产生该输出的其他命令,而无需通过 shell 变量。但是,如果您在 shell 变量中确实有列表,您也可以同时
printf
打印这两个列表,而无需对多个命令进行分组: