【问题标题】:Shell script : replacing and adding characters in a stringShell 脚本:替换和添加字符串中的字符
【发布时间】:2014-06-24 09:55:18
【问题描述】:

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

所以我不需要更改其中的任何内容。

【问题讨论】:

    标签: linux bash shell unix sh


    【解决方案1】:

    问题是,shell 去掉了引号,所以脚本甚至看不到它们。如果您对参数中的引号进行转义,则可以使用您的脚本:

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

    或者你可以在脚本中使用这一行:

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

    【讨论】:

    • 它解决了#define MY_MACR0_VALUE "123ABCD" 的问题,但我有一些宏要在命令行中传递,这些宏不会具有任何价值,例如:#define INCLUDE_SOMEFILE,您的解决方案是通过添加额外的“在他们的结局是这样的#define INCLUDE_SOMEFILE"。我很遗憾没有提到它。
    【解决方案2】:

    您可以使用sed。像这样:

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

    输出:

    #define MY_MACR0_VALUE "123ABCD"    
    

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        awk -F "=" '{print "#define",$1,$2}' &lt;&lt;&lt; "$1"

        没有显示字段分隔符,因此它删除了= 并打印了第一部分和第二部分,并在它们之前添加了#define

        【讨论】:

          猜你喜欢
          • 2014-11-24
          • 1970-01-01
          • 1970-01-01
          • 2016-09-03
          • 1970-01-01
          • 1970-01-01
          • 2012-11-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多