我有一个像这样的文件:
lbsrv_standards-d
lbsrv_standards-t
lbsrv_standards期望产出:
rename lbsrv_standards-d lb_standards-d
rename lbsrv_standards-t lb_standards-t
rename lbsrv_standards lb_standards所以我需要打印$1,一个空格,然后打印一个修改后的$1,我一直在使用awk,但是如果不在原始$1和修改$1之间添加一个换行符,我就找不出替代。
解决方案:
awk '{print "rename "$1} ; { gsub("lbsrv", "lb", $1) ; print }'输出:
rename lbsrv_standards-d
lb_standards-d
rename lbsrv_standards-t
lb_standards-t
rename lbsrv_standards
lb_standards如能提供任何协助,将不胜感激。
谢谢
发布于 2019-02-28 18:42:36
你可以用
awk '{a=$0; sub(/^lbsrv/, "lb", a); print "rename "$0" "a }'见在线演示
详细信息
a=$0 -用整行的值声明一个临时变量。sub(/^lbsrv/, "lb", a) -字符串开头的lbsrv被替换为lbprint "rename "$0" "a -打印结果:rename、空格、整行、空格,然后打印a变量的内容。使用sed可以提供更简单的解决方案(特别是当字符串单独出现时):
sed 's~^lbsrv\(.*\)~& lb\1~' file > newfile请参阅演示
这是一个基于BRE模式的sed命令,它可以找到
^ -行的开始lbsrv -子字符串\(.*\) -第1组:行/输入末尾的任何0或更多字符。& lb\1是一种替换模式,它首先取整行,然后追加一个空格、lb,然后是Group 1的内容。
发布于 2019-02-28 18:46:35
第一解决方案:,请您试一试。
awk 'BEGIN{FS="_"}{print "rename",$0,"lb_"$2}' Input_file解释:现在添加对上述代码的解释。
awk ' ##Starting awk program from here.
BEGIN{ ##Starting BEGIN section here.
FS="_" ##Setting field separator as _ here.
} ##Closing BEGIN section of awk command here.
{
print "rename",$0,"lb_"$2 ##Printing string rename then complete line then lb_ string with 2nd column here as per OP need.
}' Input_file ##Mentioning Input_file name here.第二个解决方案:现在添加一个sed解决方案。
sed 's/\([^_]*\)_\(.*\)/rename \1_\2 lb_\2/' Input_file输出如下。
rename lbsrv_standards-d lb_standards-d
rename lbsrv_standards-t lb_standards-t
rename lbsrv_standards lb_standards发布于 2019-02-28 19:02:59
其他的答案都很好,但是你可以看到,你所需要做的就是使用printf而不是print。
$ awk '{printf "rename %s ", $1} ; { gsub("lbsrv", "lb", $1) ; print }' file
rename lbsrv_standards-d lb_standards-d
rename lbsrv_standards-t lb_standards-t
rename lbsrv_standards lb_standards当然,通常情况下,您会将命令合并到一个操作中:
$ awk '{printf "rename %s ", $1; gsub("lbsrv", "lb", $1) ; print }' file此外,默认情况下,gsub在$0上运行,使用尾随1代替print是很流行的做法,所以最后:
$ awk '{printf "rename %s ", $1; gsub("lbsrv", "lb")}1' filehttps://stackoverflow.com/questions/54932186
复制相似问题