首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >修改后的重印列

修改后的重印列
EN

Stack Overflow用户
提问于 2019-02-28 18:38:13
回答 6查看 59关注 0票数 2

我有一个像这样的文件:

代码语言:javascript
复制
lbsrv_standards-d
lbsrv_standards-t
lbsrv_standards

期望产出:

代码语言:javascript
复制
rename lbsrv_standards-d lb_standards-d
rename lbsrv_standards-t lb_standards-t
rename lbsrv_standards lb_standards

所以我需要打印$1,一个空格,然后打印一个修改后的$1,我一直在使用awk,但是如果不在原始$1和修改$1之间添加一个换行符,我就找不出替代。

解决方案:

代码语言:javascript
复制
awk '{print "rename "$1} ; { gsub("lbsrv", "lb", $1) ; print }'

输出:

代码语言:javascript
复制
rename lbsrv_standards-d 
lb_standards-d
rename lbsrv_standards-t 
lb_standards-t
rename lbsrv_standards 
lb_standards

如能提供任何协助,将不胜感激。

谢谢

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2019-02-28 18:42:36

你可以用

代码语言:javascript
复制
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变量的内容。

使用sed可以提供更简单的解决方案(特别是当字符串单独出现时):

代码语言:javascript
复制
sed 's~^lbsrv\(.*\)~& lb\1~' file > newfile

请参阅演示

这是一个基于BRE模式的sed命令,它可以找到

  • ^ -行的开始
  • lbsrv -子字符串
  • \(.*\) -第1组:行/输入末尾的任何0或更多字符。

& lb\1是一种替换模式,它首先取整行,然后追加一个空格、lb,然后是Group 1的内容。

票数 0
EN

Stack Overflow用户

发布于 2019-02-28 18:46:35

第一解决方案:,请您试一试。

代码语言:javascript
复制
awk 'BEGIN{FS="_"}{print "rename",$0,"lb_"$2}'  Input_file

解释:现在添加对上述代码的解释。

代码语言:javascript
复制
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解决方案。

代码语言:javascript
复制
sed 's/\([^_]*\)_\(.*\)/rename \1_\2 lb_\2/'   Input_file

输出如下。

代码语言:javascript
复制
rename lbsrv_standards-d lb_standards-d
rename lbsrv_standards-t lb_standards-t
rename lbsrv_standards lb_standards
票数 1
EN

Stack Overflow用户

发布于 2019-02-28 19:02:59

其他的答案都很好,但是你可以看到,你所需要做的就是使用printf而不是print

代码语言:javascript
复制
$ 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

当然,通常情况下,您会将命令合并到一个操作中:

代码语言:javascript
复制
$ awk '{printf "rename %s ", $1; gsub("lbsrv", "lb", $1) ; print }' file

此外,默认情况下,gsub$0上运行,使用尾随1代替print是很流行的做法,所以最后:

代码语言:javascript
复制
$ awk '{printf "rename %s ", $1; gsub("lbsrv", "lb")}1' file
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54932186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档