使用 sed (正则表达式) 过滤输入

使用 sed (正则表达式) 过滤输入

我遇到一个问题,当使用正则表达式模式清理 mysql 查询的某些输出时,sed 没有返回我期望的内容。

mysql -uroot -p -e 'SELECT `path` FROM db.media_gallery' | sed -n -r 's/[^\/]+([^\s]+).*/\1/p'

该查询返回一堆如下的行:

| /media/M/W/lmt_MWS04_8.png    |
| /media/M/W/lmt_MWS02_11.png   |

当我通过上面列出的 sed 命令传输此内容时,它返回以下内容:

//M/W/lmt_MWS04_8.png
//M/W/lmt_MWS02_11.png

“媒体”去哪儿了?为什么它会随机删除我的一部分字符串?

有谁知道如何修复我的正则表达式?

答案1

不需要 sed,真正的问题是你正在使用 mysql 的美化输出,这些输出是供人类使用而不是自动使用的。这是一项简单的任务,mysql 完全有能力完成。

mysql -N -s -r -uroot -p -e 'SELECT `path` FROM db.media_gallery'

将返回:

/media/M/W/lmt_MWS04_8.png
/media/M/W/lmt_MWS02_11.png

来自‘man mysql’:

--skip-column-names, -N
--silent, -s
--raw, -r

答案2

“media” 匹配“[^/]+”,因此它被括号中的内容替换。如果需要它,您需要在该正则表达式子句之前打开括号。

相关内容