我想将一行分成两列
./ABC/dce/app/config/fgh/pqr/app.properties:app.pass=*****
我希望上面的行中的冒号(:) 作为分隔符并输出如下
./ABC/dce/app/config/fgh/pqr/app.properties app.pass
有人能帮我吗 ?
答案1
您可以使用awk
awk -F"[:=]" '{print $1"\t"$2}' $file
我们设置了 2 个分隔符,FS
这样我们就可以将后面的所有内容设置=
为一列并将其排除。
你也可以使用sed
sed -E 's/(^.*):(.*)=.*/\1\t\2/'
输出*
./ABC/dce/app/config/fgh/pqr/app.properties app.pass
答案2
你可以试试:
echo "./ABC/dce/app/config/fgh/pqr/app.properties:app.pass=*****" | tr ':' '\t'
答案3
也使用awk
这种可能性:
echo './ABC/dce/app/config/fgh/pqr/app.properties:app.pass=*****' | awk 'sub(/=[^=]*$/,""){sub(/:/,"\t")} 1'
./ABC/dce/app/config/fgh/pqr/app.properties app.pass
sub()
替换成功则返回1;否则为 0。- 条件:第一个
sub()
函数。有替代品吗?如果是,则执行该操作,即第二个sub()
函数。 - 第一个
sub()
:sub(/=[^=]*$/,"")
从 删除=
到最后。 - 第二
sub()
:sub(/:/,"\t")
替换:
选项卡\t
答案4
使用乐(以前称为 Perl_6)
如果您只想分割一个:
冒号:
raku -ne '.split(":").join("\t").put;'
但是,如果您想清理第二个元素(索引=1):
raku -ne '.=split(":"); put( .[0] ~ "\t" ~ .[1].subst(/ \=.* /));'
输入示例:
./ABC/dce/app/config/fgh/pqr/app.properties:app.pass=*****
输出示例 (1):
./ABC/dce/app/config/fgh/pqr/app.properties app.pass=*****
输出示例 (2):
./ABC/dce/app/config/fgh/pqr/app.properties app.pass
简而言之,该split
程序破坏性地分裂:
结肠,将其移除。在第一个示例中,生成的字符串使用制表符重新连接在一起\t
。在第二个示例中,结果字符串实际上$_
使用赋值运算符保存回主题变量中.=
,因此可以执行第二个操作(.=
是 的简写$_.=
)。第二个操作将正则表达式subst
替换\=.*
为空(即删除它)。
请注意,Raku 中的字符串连接是通过~
波形符完成的。上面的代码完成了所请求的任务——但是,如果您想更改列之间的间距,您可以尝试使用类似的字符串连接~ "\t" xx 4 ~
(即\t
制表符重复 4 次)。