提取两个特殊字符之间的文本

时间:2019-04-18 06:30:11

标签: shell awk sed

尝试通过"\提取特殊字符\"sed之间的文本

Ex: "\hell@#$\"},

预期输出:hell@#$

2 个答案:

答案 0 :(得分:2)

使用捕获组和带有基本正则表达式的反向引用,您可以轻松地做到这一点:

sed 's/^["][\]\([^\]*\).*$/\1/'

说明

  • 常规替换sed 's/find/replace/,其中
  • 在开始包含^["][\](零个或多个字符而不是\的捕获\(...\)之前,
  • 查找是[^\]*的双引号和\,关闭捕获\),然后.*$关闭字符串的其余部分;
  • replace是\1(第一个后向引用),其中包含在\(...\)之间捕获的文本。

注意:,如果您的"\没有以字符串开头,请删除第一个'^'锚点)

示例

$ echo '"\hell@#$\"},' | sed 's/^["][\]\([^\]*\).*$/\1/'
hell@#$

仔细研究一下,如果您有任何疑问,请告诉我。

答案 1 :(得分:0)

这可能对您有用(GNU sed):

sed -nE '/"\\[^\\]*\\+([^\\"][^\\]*\\+)*"/{s/"\\/\n/;s/.*\n//;s/\\"/\n/;P;D}' file

解决方案分为两部分:

首先,使用正则表达式确定两个字符对是否存在。这可能很棘手,因为否定的类是不够的,因为边缘情况很容易击败简单化的方法。

第二,一旦确实存在一对字符,则必须提取它们之间的文字。