Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 用sed替换匹配字符串中的内容_Regex_Linux_Replace_Sed - Fatal编程技术网

Regex 用sed替换匹配字符串中的内容

Regex 用sed替换匹配字符串中的内容,regex,linux,replace,sed,Regex,Linux,Replace,Sed,我有一个java属性文件,如下所示 server.port=8080 spring.application.name=app1 spring.datasource.driver-class-name=org.mysql.jdbc.Driver SERVER_PORT=8080 SPRING_APPLICATION_NAME=app1 SPRING_DATASOURCE_DRIVER_CLASS_NAME=org.mysql.jdbc.Driver 我想将该文件转换为类似于linux的属性文件

我有一个java属性文件,如下所示

server.port=8080
spring.application.name=app1
spring.datasource.driver-class-name=org.mysql.jdbc.Driver
SERVER_PORT=8080
SPRING_APPLICATION_NAME=app1
SPRING_DATASOURCE_DRIVER_CLASS_NAME=org.mysql.jdbc.Driver
我想将该文件转换为类似于linux的属性文件,如下所示

server.port=8080
spring.application.name=app1
spring.datasource.driver-class-name=org.mysql.jdbc.Driver
SERVER_PORT=8080
SPRING_APPLICATION_NAME=app1
SPRING_DATASOURCE_DRIVER_CLASS_NAME=org.mysql.jdbc.Driver
我使用的是
sed
,我可以使用下面的sed命令转换属性名称

sed "s/^\(.*\)=\(.*\)$/\U\1=\E\2/" application.properties
但是,我无法找出如何将匹配部分(
\1
)中的点(
)替换为下划线(
\u
)字符


有人能帮忙吗?

如果
perl
没有问题:

$ perl -pe 's/^.*=/\U$&/; s/^.*=/$&=~s|\.|_|gr/e' application.properties 
SERVER_PORT=8080
SPRING_APPLICATION_NAME=app1
SPRING_DATASOURCE_DRIVER-CLASS-NAME=org.mysql.jdbc.Driver
  • s/^.*/$&=~s |\.| | | gr/e
    对捕获的文本使用另一个替换
    ^.*=
可以简化为

$ perl -pe 's/^.*=/uc $&=~s|\.|_|gr/e' application.properties 
SERVER_PORT=8080
SPRING_APPLICATION_NAME=app1
SPRING_DATASOURCE_DRIVER-CLASS-NAME=org.mysql.jdbc.Driver

使用
sed

$ sed 's/^.*=/\U&/; :a s/^\([^=]*\)\./\1_/g; ta' application.properties 
SERVER_PORT=8080
SPRING_APPLICATION_NAME=app1
SPRING_DATASOURCE_DRIVER-CLASS-NAME=org.mysql.jdbc.Driver
  • :a s/^\([^=]*\)\。/\1\ug;ta
    替换为
    ,直到
    前面的文本不包含
    =


如果
-
之前的
=
都需要更改为
,请在两种解决方案中使用
[.-]
而不是
\.

如果
perl
正常:

$ perl -pe 's/^.*=/\U$&/; s/^.*=/$&=~s|\.|_|gr/e' application.properties 
SERVER_PORT=8080
SPRING_APPLICATION_NAME=app1
SPRING_DATASOURCE_DRIVER-CLASS-NAME=org.mysql.jdbc.Driver
  • s/^.*/$&=~s |\.| | | gr/e
    对捕获的文本使用另一个替换
    ^.*=
可以简化为

$ perl -pe 's/^.*=/uc $&=~s|\.|_|gr/e' application.properties 
SERVER_PORT=8080
SPRING_APPLICATION_NAME=app1
SPRING_DATASOURCE_DRIVER-CLASS-NAME=org.mysql.jdbc.Driver

使用
sed

$ sed 's/^.*=/\U&/; :a s/^\([^=]*\)\./\1_/g; ta' application.properties 
SERVER_PORT=8080
SPRING_APPLICATION_NAME=app1
SPRING_DATASOURCE_DRIVER-CLASS-NAME=org.mysql.jdbc.Driver
  • :a s/^\([^=]*\)\。/\1\ug;ta
    替换为
    ,直到
    前面的文本不包含
    =


如果
-
之前的
=
都需要更改为
\
,请使用
[.-]
而不是
\.
在这两种解决方案中

您可以使用条件循环:

sed 's/^[^=]*/\U&/;:a;s/^\([^=]*\)[.-]/\1_/;ta'
其中,
ta
跳转到标签“a”,只要有东西被替换

使用awk:

awk -F= -vOFS='=' '{$1=toupper($1);gsub("[-.]", "_", $1)}1'

您可以使用条件循环:

sed 's/^[^=]*/\U&/;:a;s/^\([^=]*\)[.-]/\1_/;ta'
其中,
ta
跳转到标签“a”,只要有东西被替换

使用awk:

awk -F= -vOFS='=' '{$1=toupper($1);gsub("[-.]", "_", $1)}1'

另一种概念上可能更简单的
perl
解决方案是:向他致敬,感谢他在简化命令方面的帮助

  • -F(=)
    -a
    结合,将每个输入行按
    =
    拆分为字段。(
    -n
    抑制默认输出,
    -e
    告诉Perl将下一个操作数视为命令)。
    =
    包含在
    (…)
    中也会使
    =
    实例成为存储在
    @F
    中的字段数组的一部分

  • $F[0]=~tr//\ur
    翻译所有文字
    字符。进入
    \uu
    字符。在第1个字段(属性名称)中,使用
    r
    选项返回结果

  • $F[0]=uc
    然后将结果转换为全大写,并用结果更新第一个字段

  • print@F
    然后打印所有字段,从修改后的第一个字段开始,用
    =
    分隔(也在
    @F
    中捕获的输出字段分隔符),实际上是用
    字符打印大写的第一个输入字段。翻译为
    \uuuuuu
    ,后跟
    =
    和未修改的输入行剩余部分


    • 另一种概念上可能更简单的
      perl
      解决方案:向他致敬,感谢他在简化命令方面的帮助

      • -F(=)
        -a
        结合,将每个输入行按
        =
        拆分为字段。(
        -n
        抑制默认输出,
        -e
        告诉Perl将下一个操作数视为命令)。
        =
        包含在
        (…)
        中也会使
        =
        实例成为存储在
        @F
        中的字段数组的一部分

      • $F[0]=~tr//\ur
        翻译所有文字
        字符。进入
        \uu
        字符。在第1个字段(属性名称)中,使用
        r
        选项返回结果

      • $F[0]=uc
        然后将结果转换为全大写,并用结果更新第一个字段

      • print@F
        然后打印所有字段,从修改后的第一个字段开始,用
        =
        分隔(也在
        @F
        中捕获的输出字段分隔符),实际上是用
        字符打印大写的第一个输入字段。翻译为
        \uuuuuu
        ,后跟
        =
        和未修改的输入行剩余部分


        • 带有
          剪切
          tr
          粘贴
          和过程替换(需要Bash):


          $paste-d=带有
          cut
          tr
          paste
          和流程替换(需要Bash):


          $paste-d=good-one,也可以使用
          perl-F'/(=)/'-ane'$F[0]=~tr/$F[0]=uc$F[0];还可以使用
          r
          修饰符-->
          $F[0]=uc$F[0]=~tr///\ur
          -F'(=)'
          打印@F'
          ,表示分隔字符
          =
          也保存在
          @F
          数组中。。。检查
          perl-F'(=)'-lane'print$F[1]'
          vs
          perl-F'='-lane'print$F[1]'
          @Sundeep:Got;我对使用带有
          -F
          的捕获组有一个误解;现在更正。为了回答我自己的问题:与
          -F
          一起使用的捕获组将分隔符添加到字段数组在的帮助主题中进行了描述,这可能是因为
          print@F
          仍然需要一个循环并使用
          $,
          ,我们在join中也做了类似的操作。。但是捕获分隔符会带来额外的惩罚。好的,也可以使用
          perl-F'/(=)/'-ane'$F[0]=~tr/$F[0]=uc$F[0];还可以使用
          r
          修饰符-->
          $F[0]=uc$F[0]=~tr///\ur
          -F'(=)'
          打印@F'
          ,表示分隔字符
          =
          也保存在
          @F
          数组中。。。检查
          perl-F'(=)'-lane'print$F[1]'
          vs
          perl-F'='-lane'print$F[1]'
          @Sundeep:Got;我对什么有一个误解