修改后重印专栏

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 }'

online demo

详情

  • a=[=12=] - 用整行的值声明了一个临时变量
  • sub(/^lbsrv/, "lb", a) - 字符串开头的 lbsrv 替换为 lb
  • print "rename "[=16=]" "a - 打印结果:rename、space、整行、space,然后是 a 变量的内容。

使用 sed 可以实现更简单的解决方案(尤其是当字符串单独出现时):

sed 's~^lbsrv\(.*\)~& lb~' file > newfile

this sed demo

这是一个基于 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

$