修改后重印专栏
Reprint column with modifications
我有一个如下所示的文件:
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,a space 然后打印 $1 的修改版本,我一直在使用 awk 但如果不在原始和之间添加换行符我无法找出替换已修改 $1s.
解决方案:
awk '{print "rename "} ; { gsub("lbsrv", "lb", ) ; print }'
输出:
rename lbsrv_standards-d
lb_standards-d
rename lbsrv_standards-t
lb_standards-t
rename lbsrv_standards
lb_standards
如有任何帮助,我们将不胜感激
谢谢
您可以使用
awk '{a=[=10=]; sub(/^lbsrv/, "lb", a); print "rename "[=10=]" "a }'
详情
a=[=12=]
- 用整行的值声明了一个临时变量
sub(/^lbsrv/, "lb", a)
- 字符串开头的 lbsrv
替换为 lb
print "rename "[=16=]" "a
- 打印结果:rename
、space、整行、space,然后是 a
变量的内容。
使用 sed
可以实现更简单的解决方案(尤其是当字符串单独出现时):
sed 's~^lbsrv\(.*\)~& lb~' file > newfile
这是一个基于 BRE POSIX 模式的 sed
命令,可以找到
^
- 行首
lbsrv
- 子字符串
\(.*\)
- 第 1 组:到 line/input. 末尾的任何 0 个或更多字符
& lb
是一个替换模式,首先取整行,然后附加 space、lb
,然后是第 1 组的内容。
第一个解决方案:能否请您尝试以下。
awk 'BEGIN{FS="_"}{print "rename",[=10=],"lb_"}' 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",[=11=],"lb_" ##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 _ lb_/' 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 ", } ; { gsub("lbsrv", "lb", ) ; 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 ", ; gsub("lbsrv", "lb", ) ; print }' file
此外,gsub
默认在 [=16=]
上运行,使用尾随 1
代替 print
很流行,所以最后:
$ awk '{printf "rename %s ", ; gsub("lbsrv", "lb")}1' file
如果创建输出意味着结束实际重命名文件,您可以改为这样做:
$ rename lbsrv_ lb_ lbsrv_standards{-d,-t,}
将对指定的三个文件进行前缀重命名(bash 大括号扩展后)。
这可能对你有用 (GNU sed):
sed 's/lbsrv\(.*\)/rename & lb/p;d' file
使用模式匹配来识别行中需要复制的部分并打印成功匹配,否则删除该行。
使用 Perl
perl -pe ' s/lb(?:srv)(.*)/rename $& lb/g '
根据您给定的输入
$ cat jim.txt
lbsrv_standards-d
lbsrv_standards-t
lbsrv_standards
$ perl -pe ' s/lb(?:srv)(.*)/rename $& lb/g ' jim.txt
rename lbsrv_standards-d lb_standards-d
rename lbsrv_standards-t lb_standards-t
rename lbsrv_standards lb_standards
$
我有一个如下所示的文件:
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,a space 然后打印 $1 的修改版本,我一直在使用 awk 但如果不在原始和之间添加换行符我无法找出替换已修改 $1s.
解决方案:
awk '{print "rename "} ; { gsub("lbsrv", "lb", ) ; print }'
输出:
rename lbsrv_standards-d
lb_standards-d
rename lbsrv_standards-t
lb_standards-t
rename lbsrv_standards
lb_standards
如有任何帮助,我们将不胜感激
谢谢
您可以使用
awk '{a=[=10=]; sub(/^lbsrv/, "lb", a); print "rename "[=10=]" "a }'
详情
a=[=12=]
- 用整行的值声明了一个临时变量sub(/^lbsrv/, "lb", a)
- 字符串开头的lbsrv
替换为lb
print "rename "[=16=]" "a
- 打印结果:rename
、space、整行、space,然后是a
变量的内容。
使用 sed
可以实现更简单的解决方案(尤其是当字符串单独出现时):
sed 's~^lbsrv\(.*\)~& lb~' file > newfile
这是一个基于 BRE POSIX 模式的 sed
命令,可以找到
^
- 行首lbsrv
- 子字符串\(.*\)
- 第 1 组:到 line/input. 末尾的任何 0 个或更多字符
& lb
是一个替换模式,首先取整行,然后附加 space、lb
,然后是第 1 组的内容。
第一个解决方案:能否请您尝试以下。
awk 'BEGIN{FS="_"}{print "rename",[=10=],"lb_"}' 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",[=11=],"lb_" ##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 _ lb_/' 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 ", } ; { gsub("lbsrv", "lb", ) ; 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 ", ; gsub("lbsrv", "lb", ) ; print }' file
此外,gsub
默认在 [=16=]
上运行,使用尾随 1
代替 print
很流行,所以最后:
$ awk '{printf "rename %s ", ; gsub("lbsrv", "lb")}1' file
如果创建输出意味着结束实际重命名文件,您可以改为这样做:
$ rename lbsrv_ lb_ lbsrv_standards{-d,-t,}
将对指定的三个文件进行前缀重命名(bash 大括号扩展后)。
这可能对你有用 (GNU sed):
sed 's/lbsrv\(.*\)/rename & lb/p;d' file
使用模式匹配来识别行中需要复制的部分并打印成功匹配,否则删除该行。
使用 Perl
perl -pe ' s/lb(?:srv)(.*)/rename $& lb/g '
根据您给定的输入
$ cat jim.txt
lbsrv_standards-d
lbsrv_standards-t
lbsrv_standards
$ perl -pe ' s/lb(?:srv)(.*)/rename $& lb/g ' jim.txt
rename lbsrv_standards-d lb_standards-d
rename lbsrv_standards-t lb_standards-t
rename lbsrv_standards lb_standards
$