我想将 sed 模式匹配替换为作为逗号分隔列表的 ascii 十进制表示。将模式转换为 csv-integer sting 在 bash 函数内完成。该功能正在发挥作用,但我很难将其集成到 sed 调用中。这是示例代码:
#!/bin/bash
xx(){
##turns a string into its
##ascii-integer representation as a comma-separated list
##ignores double quotes at the start and end
n=0;o=""
for((k=1;k<$(echo $1 | wc -c);k++))
do
x=$(echo $1 | cut -b"$k")
a=$(printf '%d\n' "'$x" )
if [ $a = 34 ]
then
continue
else
n=$(($n+1))
if [ $n = 1 ]
then
o=$a
else
o=$(echo $o","$a)
fi
fi
done
o=$(echo '('$o')')
echo $o
}
##this works
xx "\"bla\""
##this does not work
y=$(echo "\"bla_x\"" | sed -e "s/bla/$(xx &)p")
该功能有效,但 sed 集成失败。从谷歌搜索我得到的印象是这原则上应该是可能的,所以可能只是一个小的语法错误。
非常感谢任何帮助。
祝一切顺利
注意:在最终应用程序中,sed 的输入是一个带有 reg-exp 模式的文件(例如“k_[[:alnum:]]{5}”),将被 csv 连接替换。所以最终“xx”必须从 sed 中调用。
仔细查看您的 sed 调用,它缺少 s/// 命令的结束斜杠。接下来,您将使用双引号,因此即使在 sed 运行之前,由于双引号插值,s/// 命令的 rhs 已被填充。这不是你想要的。然而,这仍然不会让你越过球门柱。
有一个鲜为人知的标志/e
的GNU sed's s///
命令。在这种情况下,这正是医生所要求的。它的作用是,基于运行 rhs 中给出的 shell 代码并用它的输出替换它,动态构造 s/// 命令的 rhs。注意:它需要匹配整个模式空间。
这也要求您的用户定义函数被导出以供孩子使用。
#this does not work
##this is what YOU wrote
y=$(echo "\"bla_x\"" |
sed -e "s/bla/$(xx &)p")
##this now WORKS
export -f xx
y=$(
echo '"bla_x"' |
sed -Ee '
s/^.(.*)(_x).$/echo "$(xx '"\1"')\2"/e
'
)
echo "$y"
(98,108,97)_x
请注意在 sed 命令中使用单引号。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句