[英]Shell script : replacing and adding characters in a string
我是Shell脚本的新手,在执行以下操作时遇到了麻烦:
我有这个:
MY_MACR0_VALUE="123ABCD"
我想将其转换为:
#define MY_MACR0_VALUE "123ABCD"
我正在这样做:
//that string is coming from command line
newvar=$(echo "$1" | tr '=' ' ')
echo "#define $newvar" >> MacroFile.h
我得到这个:
#define MY_MACR0_VALUE 123ABCD
代替
#define MY_MACR0_VALUE "123ABCD"
双引号丢失了。
如何修复脚本以获得所需的结果?
编辑
我可能还会从命令行中获取一些非有价值的宏,例如
INCLUDE_SOMETHING
应更改为
#define INCLUDE_SOMETHING
因此,我不需要更改其中的任何内容。
问题是,shell删除了引号,因此脚本甚至看不到引号。 如果您对参数中的引号进行转义,则可以使用脚本:
sh script.sh MY_MACR0_VALUE=\"123ABCD\"
或者,您可以在脚本中使用此行:
echo "#define $(sed '/=/{s/=/ "/;s/$/"/}' <<< $1)" >> MacroFile.h
您可以使用sed
。 像这样:
sed 's/\([^=]*\)=\(.*\)/#define \1 \2/' <<< "$1"
输出:
#define MY_MACR0_VALUE "123ABCD"
该命令将=
之前和之后的部分分成单独的捕获组,并将它们填充到最终字符串中。
sed
解决方案,无需使用捕获组,
sed 's/^/#define /g;s/=/ /g' <<< "$1"
例:
$ echo 'MY_MACR0_VALUE="123ABCD"' | sed 's/^/#define /g;s/=/ /g'
#define MY_MACR0_VALUE "123ABCD"
说明:
s/^/#define /g
在开头添加#define
。
s/=/ /
用空格替换=
符号。
awk -F "=" '{print "#define",$1,$2}' <<< "$1"
没有显示字段分隔符,因此它删除了=
,并在它们之前打印了#define的第一部分和第二部分
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.