首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用sed复制行并删除重复项中的字符

使用sed复制行并删除重复项中的字符
EN

Stack Overflow用户
提问于 2011-09-10 09:29:47
回答 5查看 20K关注 0票数 18

我有一个如下所示的文件:

代码语言:javascript
复制
@"Afghanistan.png",
@"Albania.png",
@"Algeria.png",
@"American_Samoa.png",

我想让它看起来像这样

代码语言:javascript
复制
@"Afghanistan.png",
@"Afghanistan",
@"Albania.png",
@"Albania",
@"Algeria.png",
@"Algeria",
@"American_Samoa.png",
@"American_Samoa",

我认为我可以使用sed来做这件事,但我不知道如何在缓冲区中存储内容,然后对其进行修改。

我是否使用了正确的工具?

谢谢

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-09-10 09:41:04

使用sed很容易做到这一点,您甚至不需要使用保留空间( sed辅助缓冲区)。给定下面的input文件:

代码语言:javascript
复制
$ cat input 
@"Afghanistan.png",
@"Albania.png",
@"Algeria.png",
@"American_Samoa.png",

您应该使用以下命令:

代码语言:javascript
复制
sed 's/@"\([^.]*\)\.png",/&\
@"\1",/' input 

结果是:

代码语言:javascript
复制
$ sed 's/@"\([^.]*\)\.png",/&\
@"\1",/' input 
@"Afghanistan.png",
@"Afghanistan",
@"Albania.png",
@"Albania",
@"Algeria.png",
@"Algeria",
@"American_Samoa.png",
@"American_Samoa",

此命令只是一个替换命令(s///)。它匹配所有以@"开头、非句点字符([^.]*)和.png",开头的字符。此外,它使用组方括号\(\)匹配.png",之前的所有非句点字符,因此我们可以获得该组匹配的字符。因此,这是要替换的正则表达式:

代码语言:javascript
复制
@"\([^.]*\)\.png",

所以跟在命令的替换部分之后。&命令只是在更改后的内容中插入与@"\([^.]*\)\.png",匹配的所有内容。如果它是替换部件的唯一元素,则不会更改输出中的任何内容。但是,&后面有一个换行符-由反斜杠\表示,后面跟一个实际的换行符-在新行中,我们添加@"字符串,后跟第一个组(\1)的内容,然后是字符串",

这只是对该命令的简要说明。希望这能有所帮助。还要注意,在某些版本的sed (比如GNU )中,您可以使用\n字符串来表示换行符。它将呈现一个更简洁、更易读的命令:

代码语言:javascript
复制
sed 's/@"\([^.]*\)\.png",/&\n@"\1",/' input 
票数 13
EN

Stack Overflow用户

发布于 2011-09-10 09:47:42

您不必使用正则表达式和替换字符串:使用sed的p命令完整地打印该行,然后修改该行并让其隐式打印

代码语言:javascript
复制
sed 'p; s/\.png//'
票数 18
EN

Stack Overflow用户

发布于 2014-01-30 20:10:10

Glenn jackman的响应是OK,但它也会将不匹配表达式的行数加倍。

相反,这个表达式只将匹配该表达式的行数加倍:

代码语言:javascript
复制
sed -n 'p; s/\.png//p'

在这里,-n代表“除非显式打印,否则什么都不打印”,如果进行了替换,则s/\.png//p中的p强制打印,否则不强制打印

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7369047

复制
相关文章

相似问题

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