繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM