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

RNs*_*ost 15 regex sed

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

@"Afghanistan.png",
@"Albania.png",
@"Algeria.png",
@"American_Samoa.png",
Run Code Online (Sandbox Code Playgroud)

我希望它看起来像这样

@"Afghanistan.png",
@"Afghanistan",
@"Albania.png",
@"Albania",
@"Algeria.png",
@"Algeria",
@"American_Samoa.png",
@"American_Samoa",
Run Code Online (Sandbox Code Playgroud)

我以为我可以使用sed来做这个但我无法弄清楚如何将某些东西存储在缓冲区然后修改它.

我甚至使用合适的工具吗?

谢谢

gle*_*man 16

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

sed 'p; s/\.png//'
Run Code Online (Sandbox Code Playgroud)


bra*_*zzi 11

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

$ cat input 
@"Afghanistan.png",
@"Albania.png",
@"Algeria.png",
@"American_Samoa.png",
Run Code Online (Sandbox Code Playgroud)

你应该使用这个命令:

sed 's/@"\([^.]*\)\.png",/&\
@"\1",/' input 
Run Code Online (Sandbox Code Playgroud)

结果:

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

这个命令只是一个替换命令(s///).它匹配任何开头,@"后跟非周期字符([^.]*),然后匹配.png",.此外,所有非周期匹配字符前.png",使用组支架\(\),所以我们可以得到什么是由该组匹配.所以,这是要替换的正则表达式:

@"\([^.]*\)\.png",
Run Code Online (Sandbox Code Playgroud)

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

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

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


Car*_*ala 10

格伦杰克曼的回答是可以的,但它也使那些与表达不符的行加倍.

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

sed -n 'p; s/\.png//p'
Run Code Online (Sandbox Code Playgroud)

这里,-n代表"除非明确打印否则不打印",s/\.png//p如果替换完成则p 强制打印,否则不强制它

  • 对于代码生成器模板,我只需要复制目标源文件中的匹配行;这个答案很明确——谢谢! (2认同)

cou*_*ndj 8

我比Carles Sala和Glenn Jackman更喜欢这个:

sed '/.png/p;s/.png//'
Run Code Online (Sandbox Code Playgroud)

可以说这是个人喜好.