regex - 使用sed复制行并从重复项中删除字符

标签 regex sed

我有一个看起来像这样的文件:

@"Afghanistan.png",
@"Albania.png",
@"Algeria.png",
@"American_Samoa.png",


我希望它看起来像这样

@"Afghanistan.png",
@"Afghanistan",
@"Albania.png",
@"Albania",
@"Algeria.png",
@"Algeria",
@"American_Samoa.png",
@"American_Samoa",


我以为可以使用sed来执行此操作,但是我不知道如何在缓冲区中存储某些内容然后进行修改。

我什至在使用正确的工具吗?

谢谢

最佳答案

使用sed相当容易,甚至不需要使用保持空间(sed辅助缓冲区)。鉴于以下input文件:

$ cat input 
@"Afghanistan.png",
@"Albania.png",
@"Algeria.png",
@"American_Samoa.png",


您应该使用以下命令:

sed 's/@"\([^.]*\)\.png",/&\
@"\1",/' input 


结果:

$ sed 's/@"\([^.]*\)\.png",/&\
@"\1",/' input 
@"Afghanistan.png",
@"Afghanistan",
@"Albania.png",
@"Albania",
@"Algeria.png",
@"Algeria",
@"American_Samoa.png",
@"American_Samoa",


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

@"\([^.]*\)\.png",


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

这只是该命令的简要说明。希望这可以帮助。另外,请注意,在某些版本的sed(例如GNU sed)中,可以使用\n字符串表示换行符。它将呈现出更简洁易读的命令:

sed 's/@"\([^.]*\)\.png",/&\n@"\1",/' input 

关于regex - 使用sed复制行并从重复项中删除字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7369047/

相关文章:

regex - 使用正则表达式的最佳方式

javascript - 为 Javascript 优化 Gruber URL 正则表达式

xml - 在 +1 GB 的大型单行文本文件中使用 sed 在每个 > 之后引入换行符

linux - 使用 sed 命令的 Jenkinsfile ssh 问题

java - 如何查找 Java String 是否包含 X 或 Y 并包含 Z

regex - Sqlite3 FTS : Limiting length of items between two words in match request?

regex - SED:从两条特定行中删除模式

正则表达式替换 : '[A-Z]' ' to [A-Z ]' - I can' t preserve the letter in in the string

awk - 用文件内容替换字符串

Bash/Sed - 多行 sed 操作打印行乱序