我有一个看起来像这样的文件:
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之间添加换行符。
解:
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
任何援助将不胜感激
谢谢
你可以用
awk '{a=$0; sub(/^lbsrv/, "lb", a); print "rename "$0" "a }'
细节
a=$0
- 字符串开头的sub(/^lbsrv/, "lb", a)
被lbsrv
取代lb
变量的内容。使用print "rename "$0" "a
可以实现更简单的解决方案(特别是如果字符串单独出现):
rename
见a
这是一个基于BRE POSIX模式的sed
命令
sed 's~^lbsrv\(.*\)~& lb\1~' file > newfile
- 开始一条线sed
demo - substringsed
- 第1组:任何0或更多字符,直到行/输入的末尾。^
是一个替换模式,首先取整行,然后附加一个空格,lbsrv
,然后是第1组的内容。
第一个解决方案:你可以尝试下面的。
\(.*\)
说明:现在添加上述代码的说明。
& lb\1
第二个解决方案:现在添加lb
解决方案。
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
当然,通常你会在一个动作中组合命令:
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
将在指定的三个文件上进行前缀重命名(在bash大括号扩展之后)。
这可能适合你(GNU sed):
print
使用模式匹配来标识需要复制的行的部分并打印成功匹配,否则删除该行。
使用Perl
$ awk '{printf "rename %s ", $1; gsub("lbsrv", "lb")}1' file
与您的给定输入
$ rename lbsrv_ lb_ lbsrv_standards{-d,-t,}