用正则捕获多行字符串并用自身替换,并在每一行上缩进



背景

我有大量的Markdown文件,这些文件的代码块标记了三个背景和一个语言名称(github样式)。喜欢:

```ruby
def method_missing
  puts "Where's the method?" 
end
```

我想更改这些标记的方式,以便将代码块设置为凹痕(堆栈溢出样式),而不是使用三个背景,如下:

    def method_missing
      puts "Where's the method?" 
    end

问题

我正在使用此表达式

中的多个文件中的多个文件进行查找和重新安置
(?s)```ruby(.*?)```

这有效地捕获了我想要的东西,但是我很难找到用自身的缩进版本替换捕获组$1的好方法。充其量,我可以在整个捕获组之前插入一个软标签。

有什么建议吗?预先感谢。

另外:是否有一种快速的方法可以使用grep使用BASH脚本来执行此操作?

您不能使用grep执行此操作,但是您可以使用sed(例如CC_4)的文本操作实用程序来完成此操作。例如,说:

sed -n '/```ruby/,/```/{/```ruby/b;/```/b;s/^/    /p }' filename

会产生:

    def method_missing
      puts "Where's the method?" 
    end

用于您的样品输入。

它捕获了```ruby和三个背景之间的线;在这些线路前增加了4个空间;并打印那些。

如果您想要一个 tab 而不是这些whitespaces,请在上面的表达式中替换 s/^/ /p

我敢肯定,您可以获得一行工作,但是使用shell脚本

进行操作可能会更简单
#!/bin/bash
while IFS= read -r line; do
  if [[ $line =~ ^'```ruby' ]]; then
    indent=true
  elif [[ $line =~ ^'```' ]]; then
    indent=
  else
    [[ -n $indent ]] && echo -e "t$line" || echo "$line"
  fi
done < file

相关内容

  • 没有找到相关文章

最新更新