Linux Shell脚本:替换和添加字符串中的字符
我不熟悉shell脚本,在执行以下操作时遇到困难: 我有这个:Linux Shell脚本:替换和添加字符串中的字符,linux,bash,shell,unix,sh,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 我明白了: #de
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"
缺少双引号。
如何修复脚本以获得所需的结果
编辑
我可能还有一些命令行中的无值宏,比如
包括一些内容
哪个应该改成
\define INCLUDE\u SOMETHING
因此,我不需要更改其中的任何内容。您可以使用
sed
。像这样:
sed 's/\([^=]*\)=\(.*\)/#define \1 \2/' <<< "$1"
该命令将
=
之前和之后的部分获取为单独的捕获组,并将它们填充到最终字符串。sed
解决方案,而不使用捕获组
sed 's/^/#define /g;s/=/ /g' <<< "$1"
说明:
在开头添加s/^/#define/g
#define
将s/=/
符号替换为空格=
- 问题是,shell正在剥离引号,因此脚本甚至看不到它们。如果在参数中转义引号,则可以使用脚本:
sh script.sh MY_MACR0_VALUE=\"123ABCD\"
也可以在脚本中使用这一行:
echo "#define $(sed '/=/{s/=/ "/;s/$/"/}' <<< $1)" >> MacroFile.h
echo“#define$(sed'/=/{s/=”/{s/$/“/}”awk-F”=“{print”#define“,$1,$2}”它修复了的问题#定义我的MACR0值“123ABCD”
但我在命令行中要传递一些宏,这些宏没有任何值,例如:;define INCLUDE#INCLUDE#SOMEFILE
,你的解决方案是通过添加一个额外的“代码”来破坏它们在他们的结尾像这样#define INCLUDE_SOMEFILE“
。糟糕的是,我没有提到这个问题。
echo "#define $(sed '/=/{s/=/ "/;s/$/"/}' <<< $1)" >> MacroFile.h