Shell脚本:替换和添加字符串中的字符

时间:2014-06-24 09:55:19

标签: linux bash shell unix sh

我是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

所以我不需要改变它们中的任何内容。

4 个答案:

答案 0 :(得分:2)

问题是,shell正在删除引号,因此脚本甚至看不到它们。如果转义参数中的引号,则可以使用脚本:

sh script.sh MY_MACR0_VALUE=\"123ABCD\"

或者您可以在脚本中使用此行:

echo "#define $(sed '/=/{s/=/ "/;s/$/"/}' <<< $1)" >> MacroFile.h

答案 1 :(得分:0)

您可以使用sed。像这样:

sed 's/\([^=]*\)=\(.*\)/#define \1 \2/' <<< "$1"

输出:

#define MY_MACR0_VALUE "123ABCD"    

该命令将=之前和之后的部分获取到单独的捕获组中,并将它们填充到最终字符串中。

答案 2 :(得分:0)

不使用捕获组的

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/=/ /用空格替换=符号。

答案 3 :(得分:0)

awk -F "=" '{print "#define",$1,$2}' <<< "$1"

没有显示字段分隔符,因此删除了=并使用#define打印第一和第二部分