regex - 在 awk 中更改 FS 以匹配任何不是文件路径的内容

标签 regex bash awk

我正在尝试使用 awk 从程序的输出中提取文件路径。这是我第一次使用awk,我听说它对这种东西很好,所以我打开了GNU手册:https://www.gnu.org/software/gawk/manual/gawk.html (awk 符号链接(symbolic link)到我机器上的 gawk)

我正在尝试更改 FS 以使分隔符匹配任何非文件路径的内容。我在输入中硬编码 2 个文件路径的情况下进行了尝试:

awk -F '[^(\\/.)*]' '{print $1; print $2}'

我认为 [^(\\/.)*] 会将 FS 设置为匹配任何与文件路径不匹配的文本。我认为括号会阻止正则表达式被视为单个字符,例如[^abcd]。路径可以任意长,因此有星号。这没有用。

我的输入看起来像这样:

一大堆随机垃圾哦!一个文件/opt/dir/file,也许还有一些垃圾和另一个文件!/usr/local/bin

我期望这样的输出:

/opt/dir/file
/usr/local/bin

我将在 Bash 变量中捕获这个预期的输出。

有谁知道如何正确地做到这一点?如果我通过了 --posix 命令,如果这是正确的,这也会有所帮助。注意:垃圾中可以存储任意数量的文件路径。

最佳答案

当您想从某些文本中提取特定模式时,请使用 grep。要查找所有包含斜杠的单词:

grep -o '[^[:blank:]]*/[^[:blank:]]*'

使用 GNU grep 的 pcre 模式更容易阅读:

grep -oP '\S*/\S*'

其中 \S\s 的补码(空白)

关于regex - 在 awk 中更改 FS 以匹配任何不是文件路径的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50880071/

相关文章:

regex - pyspark 不支持正则表达式

bash - 使用键值连接两个 csv 文件

linux - 为 debian 重新编译一个包

php - 由空格/逗号分隔的标签的正则表达式,最多 n 个标签

正则表达式 (PCRE) : Match all digits conditional upon presence of a string

java - 如何将 NamedJdbcTemplate 与 Postgres 正则表达式一起使用

regex - 在sed中查找并替换文本文件中的多个字符串

bash - 使用 bash awk 根据匹配/分隔符将列拆分为多个

linux - 提取列 Awk 的一部分

awk - 提取边列表中的特定行