当前位置: 首页 > 知识库问答 >
问题:

Regex:替换除大括号内的引号

孔冥夜
2023-03-14

以下是降价文本的示例:

#“我的标题”

!图像标题。{ 样式=“浮动:右; 宽度: 20%; 边框: 1px”}

有的“引用文字”,有的*“强调文字”*等。

在bash脚本中,我试图用法语引号替换任何双引号。

例如:“word”应变成«

换句话说,一个单词前的所有引号都应该替换为一个开放的法语引号,后跟一个不间断的空格;而且一个单词后面的所有引号都要换成一个不换行的空格后面跟着一个闭合的法语引号;除非引号在花括号内。

因此,前一个标记文本应按如下方式转换:

#"我的标题"

!图像标题。{ 样式=“浮动:右; 宽度: 20%; 边框: 1px”}

一些«引用文本»,一些*«强调文本»*,等等。

我目前在脚本中使用以下正则表达式:

" Replace "word by « word
sed -i -Ee "/(^|\s|\(|\[)\"/ s//\1« /g" myfile.md
" Replace word" by word »
sed -i -Ee "/(\S)\"/ s//\1 »/g" myfile.md

当然,问题在于它替换了所有引号,甚至在大括号内。

所以我的问题是:除了在大括号内,哪个正则表达式可以用法语引号替换双引号?

共有1个答案

荀正谊
2023-03-14

使用awk:

awk -F "" '
{
  for (i=1;i<=NF;i++){                    # loop over all fields/characters in line
    if ($i=="{") brace++                  # increment counter if `{` found
    if ($i=="}") brace--                  # decrement counter if `}` found
    if (brace==0 && $i=="\""){            # if counter is zero and char is a quote
      printf "%s", (cquote ? " »" : "« ") # print closing or opening french quote
      cquote=!cquote                      # toggle flag
      continue                            # continue with next character
    }
    printf "%s", $i                       # print character
  }
  print ""                                # print newline
}' file

输出:

# « My title »

!Image caption.{ style="float:right; width: 20%; border: 1px"}

Some « quoted text », some *« emphasized text »*, etc.
 类似资料:
  • 我试图创建一个数据数组与FLOT图表一起使用。我使用这个CodeIgniter代码来生成数组: 这段代码的问题是无法绘制生成的JSON对象,因为“值”实际上是字符串。以下是有问题的JSON输出: 这个JSON有三个问题: 需要方括号而不是花括号;和 以下是JSON输出的格式: 清理这个JSON对象的最佳方法是什么?我应该在服务器端使用CodeIgniter代码吗?或者我应该在javascript中

  • 在记事本++6.5.1中,我需要替换引号对中的某些模式。我想将替换保存为宏的一部分,所以所有的替换都需要在一个步骤中进行。 编辑:带引号的字符串中的引号用额外的引号转义,例如“”。但是,假设我已经用一个特殊的字符替换了前面的传球中的这些。因此,解决此问题的regex解决方案不必处理转义引号。

  • 我有一个特定的正则表达式,它可以在文本数据中找到一些值,例如任何10个字母,例如。问题是这个值应该只在尖括号、引号或空格内,并且应该提取该值作为结果。例如在这种情况下:

  • 我有一个类型TEXT的PostgreSQL列中的数据,我需要做一些字符替换。具体来说,我想用大括号代替方括号。问题是,我只想替换不超过两层深的括号,如果你包括主要的封闭括号。这些字符串可能很长,所以我认为正则表达式可能是最好的方法(函数),但我不擅长正则表达式。这里有一个这样的值的例子: 因此,我希望此字符串更改为: 提前谢谢!

  • 我使用的是Sublime Text 3,我有一个CSV文件,其中包含单引号: 输入: 使用正则表达式,我想“中和”但不删除不合适的单引号(例如,)和撇号(例如)。 “中和”的具体意思是将放在每个单引号/撇号前面,因此输出为: 输出: 到目前为止的进展:我想我有2件需要解决的难题。 首先,我可以使用正则表达式自己查找并替换每个字段的引号示例: 输入:查找:

  • Note: 这个特性从 FreeMarker 2.3.4 版本后才存在。 FreeMarker支持一个替换的语法。就是在FreeMarker的指令和注释中用 [ 和 ] 来代替 < 和 >,例如下面这个例子: 调用预定义指令:[#list animals as animal]...[/#list] 调用自定义指令:[@myMacro /] 注释:[#-- the comment --] 为了使用这