用sed替换匹配的字符串

时间:2016-11-07 05:53:32

标签: regex linux replace sed

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

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

我正在使用sed,我可以使用以下sed命令转换属性名称。

sed "s/^\(.*\)=\(.*\)$/\U\1=\E\2/" application.properties

但是,我无法弄清楚如何在匹配的部分(.)中用下划线(_)替换点(\1)。

有人可以帮忙吗?

4 个答案:

答案 0 :(得分:2)

如果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_/g; ta.替换为_,直到.之前的文字不包含=


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

答案 1 :(得分:2)

您可以使用条件循环:

sed 's/^[^=]*/\U&/;:a;s/^\([^=]*\)[.-]/\1_/;ta'

只要替换了某些内容,ta就会跳转到标签“a”。

使用awk:

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

答案 2 :(得分:2)

可能在概念上更简单的替代 start timeuuid @PartitionKey(1) @Column(name="start") private UUID start; 解决方案:@Sundeep提示,以帮助他简化命令。

perl
  • perl -F'(=)' -ane '$F[0] = uc $F[0] =~ tr/./_/r; print @F' application.properties -F(=)结合,将每个输入行按-a分割为字段。 (=禁止默认输出,-n告诉Perl将下一个操作数视为命令。) 在-e中加载=也会使(...)个实例成为=中存储的字段数组的一部分。

  • @F翻译所有文字$F[0] =~ tr/./_/r字符。进入.个字符。在第一个字段(属性名称)中,由于_选项,返回结果。

  • r然后将结果转换为全大写,并使用结果更新第一个字段。

  • $F[0] = uc然后打印所有字段,从修改后的第一个字段开始,以print @F(也在=中捕获的输出字段分隔符)分隔,实际打印带有@F字符的上部第一个输入字段。已转换为.,后跟_以及未修改的输入行的其余部分。

答案 3 :(得分:2)

使用cuttrpaste和流程替换(需要Bash):

$ paste -d= <(cut -f1 -d= application.properties | tr '[:lower:].-' '[:upper:]_') \
>           <(cut -f2 -d= application.properties)
SERVER_PORT=8080
SPRING_APPLICATION_NAME=app1
SPRING_DATASOURCE_DRIVER_CLASS_NAME=org.mysql.jdbc.Driver

cutpaste都使用=作为分隔符,第cuttr管道用于 exclude module: 'httpclient' exclude group: 'org.apache.httpcomponents', module: 'httpclient' 用于大写和替换带下划线的句点和破折号。