从文件的每一行中提取字符串

Zak*_*akS 6 regular-expression gawk

我有一个文件,其中每一行都包含一个句子,其中在字符 > 和 < 之间找到一个单词。例如:

Martin went shopping at >Wallmart< and lost his wallet
French food >tastes< great
Run Code Online (Sandbox Code Playgroud)

我正在寻找从 shell 运行的命令,该命令将为每一行打印 ">" 和 "<" 内的单词。

提前致谢。

sch*_*ity 11

怎么样grep

grep -oP "(?<=\>).*(?=<)"  file
Run Code Online (Sandbox Code Playgroud)

输出:

Wallmart
tastes
Run Code Online (Sandbox Code Playgroud)

编辑:

遵循@Toby Speight 评论,并假设 > 和 < 之间只有单词,为了避免在其他上下文中匹配 > 和 < 命令应该是

grep -oP "(?<=\>)\w+(?=<)"  file
Run Code Online (Sandbox Code Playgroud)

  • @user1993 `-o` 选项*仅*检索匹配项,而不是行(grep 的默认行为)。`-P` 选项允许像正则表达式一样执行 perl。`(?&lt;=\&gt;)content(?=&lt;)` 捕获模式 &gt;content&lt;,*content* 是另一个正则表达式,这就是返回的内容。 (3认同)

Nas*_*ley 8

对于awk

awk -F '[><]' '{print $2}' file
Run Code Online (Sandbox Code Playgroud)

将字段分隔符设置为>or<并打印第二个字段,即这两个字符之间的字段。

对于sed

sed 's|.*>\(.*\)<.*|\1|' file
Run Code Online (Sandbox Code Playgroud)

这使用 () 来打印>它之后的东西和<它之前的东西和它之前的东西之间的东西。

输出

Wallmart
tastes
Run Code Online (Sandbox Code Playgroud)

  • 老实说,awk 解决方案 : 也会匹配:`&lt;something&lt;` 或 `&gt;anotherthing&gt;` ...如果一行包含,比如说,`&gt;&gt; this is &gt;important&lt;`,它会发出 `" "`(因为它是前 2 个 `&gt;` 之间的空字段)。并且您的 sed : 将匹配“&lt;something with possible &gt; 和 &lt; in it .. &gt;”的*longuest* 出现在一行中。您可以使用(一点)更好的版本:`sed -e 's#.*&gt;\([^&gt;&lt;]*\)&lt;.*#\1#'`(将用第一次出现的行替换`&lt;某事&gt;`) (3认同)