从文件中将所有字符打印到匹配的模式

时间:2014-10-11 03:22:17

标签: bash awk sed grep

也许是一个愚蠢的问题,但我有一个文本文件,需要显示第一个模式匹配的所有内容,即'/'。 (所有行都不包含空格)

example.txt文件:

somename/for/example/
something/as/another/example
thisfile/dir/dir/example

首选输出:

somename
something
thisfile

我知道这个grep代码会在匹配模式后显示所有内容:

grep -o '/[^\n]*' '/my/file.txt'

那么有没有办法完成相反的操作,也许rm匹配模式或反转后显示我的首选输出?

感谢。

4 个答案:

答案 0 :(得分:1)

如果您正在调用grep之类的外部命令,则可以使用sed命令获得相同的结果,即

 echo "something/as/another/example" | sed 's:/.*::'
 something

不要专注于你想要保留的内容,而要考虑你要删除的内容,在这种情况下,在第一个'/'字符后面的所有内容。这就是sed命令的作用。

前导s表示替换,:/.*:是要匹配的模式,/.*含义与第一个/' char and all characters after that. The 2nd half of the sed command is the replacement. With ::`匹配,这意味着无需替换。

sed的传统idom是使用s/str/rep/,使用/字符来分隔替换中的搜索,但您可以在初始s之后使用您想要的任何字符(替换) )命令。

某些seds期望/ char,并希望特殊指示以下字符是sub / replace分隔符。因此,如果s:/.*::不起作用,则s\:/.*::应该有效。

IHTH。

答案 1 :(得分:0)

Yu可以使用更简单的reg exp:

/[^/]*/

克拉之后的正斜杠就是你所匹配的。

<强> jsFiddle

答案 2 :(得分:0)

假设文件名为“file.txt”

cat file.txt | cut -d "/" -f 1

这里,我们用“/”作为分隔符(-d“/”)来切割输入行。然后我们选择第一个字段(-f 1)。

答案 3 :(得分:0)

你只需要在一个否定的字符类中包含起始锚^/

grep -o '^[^/]*' file