我有一个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
)。
有人可以帮忙吗?
答案 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)
使用cut
,tr
,paste
和流程替换(需要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
cut
和paste
都使用=
作为分隔符,第cut
个tr
管道用于 exclude module: 'httpclient'
exclude group: 'org.apache.httpcomponents', module: 'httpclient'
用于大写和替换带下划线的句点和破折号。