[英]Bash Script - Nested $(..) Commands - Not working correctly
我试图在一行上执行这几个操作/命令,并将其分配给变量。 除一部分外,我的工作方式大约占90%。
我不知道您可以这样做,但我读到您可以将$(..)嵌套在其他$(..)....中,所以我试图这样做以使此工作正常进行,但似乎无法获得剩下的一切。
所以基本上,我想做的是:
1.获取文件的输出并将其分配给变量
2.然后在输出的开头添加一些文本
3.然后在输出末尾附加一些文本
4.最后删除换行符,并用“ \\ n”字符替换它们。
我可以通过多个步骤很好地完成此操作,但我想尝试以这种方式进行操作。
到目前为止,我已经尝试了以下方法:
我的第一次尝试,是在阅读有关嵌套$(..)之前:
MY_VAR=$(echo -n "<pre style=\"display:inline;\">"; cat input.txt | sed ':a;N;$!ba;s/\n/\\n/g'; echo -n "</pre>")
除了在cat命令的输出和最后一个echo命令之间添加了换行符之外,这条命令的工作方式达到了99%。 我猜这是从cat命令来的,因为sed删除了除那一行以外的所有换行符,也许...?
其他尝试:
MY_VAR=$( $(echo -n "<pre style=\"display:inline;\">"; cat input.txt; echo -n "</pre>") | sed ':a;N;$!ba;s/\n/\\n/g')
MY_VAR="$( echo $(echo -n "<pre style=\"display:inline;\">"; cat input.txt; echo "</pre>") | sed ':a;N;$!ba;s/\n/\\n/g' )"
MY_VAR="$( echo "$(echo -n "<pre style=\"display:inline;\">"; cat input.txt; echo "</pre>")" | sed ':a;N;$!ba;s/\n/\\n/g' )"
*多数其他示例都尝试过在不同的$(..)部分之间使用多余的双引号...
我进行了几次其他尝试,但是它们也都没有运气...在上面的其他几次尝试中,它似乎奏效,只是sed没有插入它的替换部分。 输出在大多数情况下是正确的,除了没有看到两行之间的“ \\ n”,它只是显示了每一行都粉碎成一条线,没有任何分隔它们的地方。
我在想,如果有人有任何想法,我在这里会缺少一些小东西。
* PS Bash是否为$(..)结构命名? 很难尝试使用Google,因为它实际上并不搜索符号...
您无需在此处嵌套命令替换。
your_var='<pre style="display:inline;">'"$(<input.txt)"'</pre>'
your_var=${your_var//$'\n'/'\n'}
"$(<input.txt)"
扩展为input.txt
的内容,但没有任何结尾的换行符。 (命令替换总是删除结尾的换行符; printf '%s' "$(cat ...)"
具有相同的效果,尽管效率较低,因为它需要一个子shell,而cat ...
则没有。) ${foo//bar/baz}
扩展为名为foo
的shell变量的内容,其中bar
所有实例都替换为baz
。 $'\\n'
是文字换行符的bash语法。 '\\n'
是bash语法,用于两个字符的字符串,以反斜杠开头。 诚然,这是如上所述的多行代码,但是它比任何涉及命令替换的东西都快得多,而且效率也更高。
但是,如果您确实想要单个嵌套的命令替换,则可以执行以下操作:
your_var=$(printf '%s' '<pre style="display:inline;">' \
"$(sed '$ ! s/$/\\n/g' <input.txt | tr -d '\n')" \
'</pre>')
printf %s
组合了其参数,且参数之间没有任何定界符 sed
操作在每行的末尾添加一个文字\\n
,除了最后一行 tr -d '\\n'
操作从文件中删除文字换行符 但是,即使没有嵌套也可以更有效地完成此方法:
printf -v your_var '%s' '<pre style="display:inline;">' \
"$(sed '$ ! s/$/\\n/g' <input.txt | tr -d '\n')" \
'</pre>')
...具有printf
的结果直接将其结果分配给your_var
,而无需任何外部命令替换(从而节省了外部子shell的开销)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.