Linux 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

我不熟悉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"
缺少双引号。

如何修复脚本以获得所需的结果

编辑

我可能还有一些命令行中的无值宏,比如

包括一些内容

哪个应该改成

\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