我有一个包含几个表的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。
但不返回任何内容。
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
匹配。(?=\))
是一个零宽度的超前断言,它与尾随右括号,但不包括在结果中。[具有用于多字符RS和RT的GNU awk: