使用正则表达式捕获多行字符串并将其替换为自身,每行都缩进

时间:2014-01-31 04:57:06

标签: regex bash grep sublimetext

背景

我有一大批markdown文件,其代码块标有三个反引号和一个语言名称(github样式)。像这样:

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

我想更改这些标记的方式,以便不使用三个反引号,代码块设置为缩进(堆栈溢出样式),如下所示:

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

问题

我正在使用此表达式

在Sublime Text中的多个文件中进行查找和替换
(?s)```ruby(.*?)```

这有效地捕获了我想要的内容,但是我找不到用自己的缩进版本替换捕获组$1的好方法。我最多可以在整个捕获组之前插入一个软选项卡。

有什么建议吗?提前谢谢。

或者:使用grep使用bash脚本是否可以快速执行此操作?

2 个答案:

答案 0 :(得分:2)

您无法使用grep执行此操作,但可以使用sed等文本操作实用程序执行此操作。例如,说:

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

会产生:

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

您的样本输入。

它捕获```ruby和三个反引号之间的线条;在这些线前添加4个空格;并打印出那些。

如果您想要 TAB 字符而不是那些空格,请在上面的表达式中将s/^/ /p替换为s/^/\t/p

答案 1 :(得分:1)

我确定你可以使用一行来运行,但使用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