如何在MySQL转储文件的一行中的多个括号之间提取文本

问题描述 投票:-1回答:2

我有一个包含几个表的MySQL转储文件。我已经有一个SED command to extract one single table

现在,我需要知道如何仅提取与特定unit_id相关联的记录。格式如下:

INSERT INTO tablename (1,999,'sometext'), (2,999,'othertext'),(3,997,'text here'),(4,123,'a string'), ...

其中999是单位ID(单个单位ID可以有多个记录)

我想要的结果是:

999,'sometext'
999,'othertext'
...

...对于第二列中显示999(或我选择的任何特定数字)的每个条目。

我尝试使用sed在括号之间选择值,如下所示:

sed -n 's/\((.*,999,.*)\)/\1/p' < result.sql

我要搜索的ID是999。

但不返回任何内容。

mysql shell sed extraction
2个回答
1
投票

Sed无法一次在同一行中输出多个匹配结果。作为一种解决方法,我们可以将输入行以适当的标点符号分成多行作为预处理。

您可以尝试以下操作:

sed 's/), *(/)\'$'\n''(/g' result.sql | sed -n 's/.*,\(999,.*\)).*/\1/p'

输出:

999,'sometext'
999,'othertext'
  • [第一个sed命令s/), *(/)\'$'\n''(/g'查找之间的逗号关闭括号和开始括号,然后用换行符替换。(假定您正在运行bash。)>
  • 下一个sed命令's/.*,\(999,.*\)).*/\1/p'提取您所需的值。
  • 或者grep-P选项(与Perl兼容的正则表达式支持)也可以。

grep -Po '(?<=,)999,.*?(?=\))' result.sql
  • 模式(?<=,)是一个零宽度的后向断言,它与前导逗号而不将其包括在结果中。
  • 模式.*?避免了greedy匹配。
  • 模式(?=\))是一个零宽度的超前断言,它与尾随右括号,但不包括在结果中。

0
投票

[具有用于多字符RS和RT的GNU awk:

© www.soinside.com 2019 - 2024. All rights reserved.