在同一行中的特定单词之后读取单词之间没有空格

时间:2018-09-03 14:29:48

标签: bash shell unix

我如何提取bash中某个特定单词之后的单词?更准确地说,我有一个文件,其中的行如下所示:

Demo.txt

    IN=../files/d
    out=../files/d
    dataload
    name

我想从上面的行中读取“ d”。

sed -n '/\/files\// s~.*/files/\([^.]*\)\..*~\1~p' file

如果行中包含“。”,则此代码有帮助。

IN=../files/d.txt

因此其打印为“ d”

这里有“ d”,没有“。”作为末端分度计。所以我想读到行尾。 i / p:

Demo.txt

IN=../files/d
    out=../files/d
    dataload
    name

输出寻找:

d
d

代码:以bash格式

3 个答案:

答案 0 :(得分:0)

sed变体应为您工作:

sed -n '/\/files\// s~.*/files/\([^.]*\).*~\1~p' file

d
d

与较早的sed相比,有一个小的变化是它与第一个捕获组之后的\.不匹配。

答案 1 :(得分:0)

您可以在PCRE中使用GNU grep

grep -oP '/files/\K[^.]+' file

-P标志使grep使用PCRE,-o使其仅显示匹配的部分,而不显示完整的行,而正则表达式中的\K省略了什么从显示的匹配部分开始。

或者,如果您无权访问GNU grep,则以下perl命令将具有相同的效果:

perl -nle 'print $& if m{/files/\K[^.]+}' file

Sample run

答案 2 :(得分:0)

当您不想考虑单个命令解决方案时,可以使用

grep -Eo "/files/." Demo.txt | cut -d/ -f3