【问题标题】:Script to add characters at the beginning of every line in a code block?在代码块的每一行开头添加字符的脚本?
【发布时间】:2014-06-10 04:50:06
【问题描述】:

我有一个包含一些代码块的降价文件,格式如下:

This is some texte.

```
// Some code
var foo = 42;
```

Some more texte.

我要做的是在作为代码块的每一行的开头添加字母“A>”。所以前一个文件的输出是:

This is some texte.

A> ```
A> // Some code
A> var foo = 42;
A> ```

Some more texte.

我该怎么做?我尝试使用 grep 制作 bash 脚本,但没有成功。

【问题讨论】:

  • 如果你清楚地说明代码块的开始和结束是什么,那将会很有帮助。它只是一个反引号,还是三个,还是任何数字?
  • @TomFenech 它是 3 个反引号,用于开始和结束一个块引用。

标签: bash grep


【解决方案1】:

这可以通过这样的 perl 单行来完成:

perl -pne '$_ = "A> $_" if /^`{3}/ ... /^`{3}/' file

这会将字符串 "A> " 添加到以三个反引号开头的行之间的范围内。

编辑

要就地编辑文件,最简单的方法是:

perl -pne '$_ = "A> $_" if /^`{3}/ ... /^`{3}/' file > tmp && mv tmp file

即将输出重定向到新文件tmp,如果命令执行成功,则覆盖file

【讨论】:

  • @pimpampoum 查看我的编辑以了解覆盖原始文件的方法
【解决方案2】:

试试这个:

sed -E 's/(.*)/A> \1/g' textfile.txt > new_textfile.txt

其中 textfile.txt 包含您的代码。

【讨论】:

  • 我在这个表达式中没有看到任何提及反引号,所以我不确定它是如何工作的。
  • 啊,我的错,我没有意识到你只需要它用于反引号之间的代码。
【解决方案3】:

使用awk

awk '/```/{ sub(/^/, "A> "); print; while (getline) { sub(/^/, "A> "); print; if (/```/) next; }  }; 1' file

输出:

This is some texte.

A> ```
A> // Some code
A> var foo = 42;
A> ```

Some more texte.

【讨论】:

    【解决方案4】:

    使用 awk:

    awk '!c && /```/{c=NR} c{$0 = "A> " $0} c<NR && /```/{c=0}1' file
    This is some texte.
    
    A> ```
    A> // Some code
    A> var foo = 42;
    A> ```
    
    Some more texte.
    

    【讨论】:

      【解决方案5】:

      使用sed:

      sed '/^```/,/^```/s/^/A> /' file_in > file_out
      

      这应该与您指定的输出完全相同。

      【讨论】:

      • 如果有两个或更多块,这可能无法按预期工作。
      • 让它成为 100 个这样的块,它仍然应该工作。替换 /begin_pattern/,/end_pattern/ 的范围将适用于输入文件中存在的尽可能多的块。
      • 我假设这样的寻址可能是贪婪的。而且我不确定sed 是否在所有版本中都有这种非贪婪行为。但是好的,您的代码适用于多个块,但我不得不删除一些反斜杠引用,因为它对我不起作用。
      • 可能是,删除反斜杠然后,没有尝试并且不确定它们并添加^作为搜索模式以使它们不贪婪。
      猜你喜欢
      • 2013-08-06
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      • 2014-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多