删除.txt中未被管道包围的所有字符(|)或以#开头的行#

时间:2014-06-02 17:40:36

标签: unix sed

我有一堆看起来像这样的.txt文件:

 # title: I Got Stripes  
 # artist: Johnny Cash  
 # metre: 4/4  
 # tonic: Db  

0.000000000 silence  
0.348299319 A, intro, | Cb:maj | Db:maj | Db:maj |, (guitar)  
3.931269841 B, verse, | Db:maj | Db:maj | Ab:maj | Ab:maj |, (voice
8.662993197 | Ab:maj | Ab:maj | Db:maj | Db:maj |  
 # tonic: Eb  
78.145873015    D, modulation, | Eb:maj | Eb:maj |, (guitar)  
80.474625850    B, verse, | Eb:maj | Eb:maj | Bb:maj | Bb:maj |, (voice  
85.104784580    | Bb:maj | Bb:maj | Eb:maj | Eb:maj |  

我需要将它们转换成这样的东西:

  # title: I Got Stripes  
  # artist: Johnny Cash  
  # metre: 4/4  
  # tonic: Db  

| Cb:maj | Db:maj | Db:maj |  
| Db:maj | Db:maj | Ab:maj | Ab:maj |  
| Ab:maj | Ab:maj | Db:maj | Db:maj |  
  # tonic: Eb  
| Eb:maj | Eb:maj |  
| Eb:maj | Eb:maj | Bb:maj | Bb:maj |  
| Bb:maj | Bb:maj | Eb:maj | Eb:maj |  

具体来说,这意味着:

  • 以#开头的每一行都需要保持完全相同
  • 每个空白行(例如我的模拟示例中的第5行)都需要留在那里
  • 对于所有其他行,需要删除管道(|)未包含的每个字符

我在不同的子目录中有+/- 700个文件。

我正在考虑编写一个sed脚本,但还是不知道该怎么做。

1 个答案:

答案 0 :(得分:2)

使用sed

sed '/^ *#/b;s/^[^|]*//;s/[^|]*$//' filename

工作原理:

  • 如果该行以#开头(#之前有可选空格),则分支到下一个周期(即不做任何事情)
  • 从该行的开头删除任何内容到|
  • |
  • 之前的行尾删除任何内容

如果您正在使用BSD sed,请将其拆分:

sed -e '/^ *#/b' -e 's/^[^|]*//;s/[^|]*$//;' filename