使用awk或sed取消注释文本块

时间:2015-10-10 09:25:40

标签: regex unix awk sed sh

假设我有一个像这个例子的文本文件:

Lorem ipsum dolor sit amet, nullam euismod tractatos id mel, has integre ornatus 
feugait ad. In eum enim putent fierent. Quo melius persecuti conceptam eu, ne probo 
autem inciderint quo, ius et atqui diceret. Causae prompta corpora ex ius. Atqui 
aperiri in duo, ex pro reque utinam.

Sea ne prima falli petentium. Ut has ancillae omnesque lucilius, vim ex alia 
audire contentiones. Error possit singulis at his. Ne purto soleat ius, detracto 
sententiae mel ne. Te eos regione detracto, eam quas accumsan detracto an.

  # Lorem ipsum dolor sit amet, nullam euismod tractatos id mel, has integre ornatus 
  # feugait ad. In eum enim putent fierent. Quo melius persecuti conceptam eu, ne probo 
  # autem inciderint quo, ius et atqui diceret. Causae prompta corpora ex ius. Atqui 
  # aperiri in duo, ex pro reque utinam.

  # Comment
  # At debet expetenda sed, sed te case ceteros adolescens. Ad sea facer minim tempor, 
  # eam facilisi definitiones ei, vix vidit erant dissentias et. Eum fierent scaevola 
  # suscipiantur eu. Eum essent platonem interesset ex, ut idque vidisse nam, labores 
  # intellegam comprehensam eos et. Eu eum appetere sententiae percipitur, ad eam hinc 
  # impetus sententiae, pro duis consetetur reprehendunt in. Id percipit iracundia 
  # abhorreant est.

  # Sea ne prima falli petentium. Ut has ancillae omnesque lucilius, vim ex alia 
  # audire contentiones. Error possit singulis at his. Ne purto soleat ius, detracto 
  # sententiae mel ne. Te eos regione detracto, eam quas accumsan detracto an.

Lorem ipsum dolor sit amet, nullam euismod tractatos id mel, has integre ornatus 
feugait ad. In eum enim putent fierent. Quo melius persecuti conceptam eu, ne probo 
autem inciderint quo, ius et atqui diceret. Causae prompta corpora ex ius. Atqui 
aperiri in duo, ex pro reque utinam.

Sea ne prima falli petentium. Ut has ancillae omnesque lucilius, vim ex alia 
audire contentiones. Error possit singulis at his. Ne purto soleat ius, detracto 
sententiae mel ne. Te eos regione detracto, eam quas accumsan detracto an.

我想使用AWK或SED取消注释# Comment行之后的后3行,所以最终看起来像这样:

  # Comment
  At debet expetenda sed, sed te case ceteros adolescens. Ad sea facer minim tempor, 
  eam facilisi definitiones ei, vix vidit erant dissentias et. Eum fierent scaevola 
  suscipiantur eu. Eum essent platonem interesset ex, ut idque vidisse nam, labores 
  # intellegam comprehensam eos et. Eu eum appetere sententiae percipitur, ad eam hinc 
  # impetus sententiae, pro duis consetetur reprehendunt in. Id percipit iracundia 
  # abhorreant est.

请解释您的解决方案,以便我可以学习和理解。我对AWK和SED的了解还处于初级阶段。

2 个答案:

答案 0 :(得分:1)

awk计算其NR变量中的行。

awk '/# Comment/ {n=NR}
     n && NR-n && NR-n<=3 {sub("# ?","")}
     {print}'

n=NR捕获# Comment出现的行数

零等于false,并且在awk中为非零,因此在条件:1)n可防止从文件开头取消注释,2)NR-n可防止取消注释从# Comment行开始,3)NR-n<=3定义了取消注释的行。

函数sub是awk的一次性字符串替换。要替换为&#34;&#34;即删除的字符串是注释符号#,后跟零或一个空格 - ?是&#34;的正则表达式量词。可选&#34; (零或一)。

答案 1 :(得分:0)

这是我尝试使用GNU sed(这可能不会对其他版本的sed起作用):

sed '/^  # Comment$/,+3 { s/^  # /  /; s/^  Comment$/  # Comment/ }'

我们匹配所有以等于" # Comment"的行开头的行和接下来的3行(+3部分是GNU扩展名,我的手册说明。)

在这些行中,我们将前导" # "替换为两个空格" ",从而取消注释该行。

但是,这也会影响您不想取消注释的起跑线。因此,我们会在以下情况下进行修复:如果结果行为" Comment",我们会重新添加"# "