14

如何使用 grep 删除单词的开头?例如:我有一个文件,其中包含:

www.abc.com

我只需要那部分

abc.com

对不起,基本问题。但是没有使用Linux的经验。

4

6 回答 6

14

您不能grep在 Unix shell 中编辑字符串,grep通常用于从文本中查找或删除某些行。你宁愿使用sed

$ echo www.example.com | sed 's/^[^\.]\+\.//'
example.com

您需要学习正则表达式才能有效地使用它

sed 也可以就地编辑文件(修改文件),如果你传递-i参数,但要小心,如果你写错sed命令和使用-i标志,你很容易丢失数据。

一个例子

从您的评论中猜测您有一个 TeX 文档,并且您想删除所有 .com 域名的第一部分。如果是您的文件test.tex

\documentclass{article}
\begin{document}
www.example.com
example.com www.another.domain.com
\end{document}

然后您可以使用此sed命令对其进行转换(将输出重定向到文件或使用 就地编辑-i):

$ sed 's/\([a-z0-9-]\+\.\)\(\([a-z0-9-]\+\.\)\+com\)/\2/gi' test.tex 
\documentclass{article}
\begin{document}
example.com
example.com another.domain.com
\end{document}

请注意:

  • 一个常见的允许符号序列后跟一个点匹配[a-z0-9-]\+\.
  • 我在正则表达式中使用了组(它的一部分在\(and\)中)来指示 URL 的第一和第二部分,并将整个匹配替换为其第二组(\2在替换模式中)
  • 域应至少是第 3 级 .com 域(每个\+重复意味着至少一个匹配项)
  • 搜索不区分大小写(i最后标记)
  • 它可以做的不仅仅是每行匹配(g最后的标志)
于 2012-07-26T16:01:34.600 回答
7

正如其他人所指出的,grep它不太适合此任务,sed是一个不错的选择,或者如果文本井井有条,那么简单cut的输入可能会更容易:

echo www.abc.com | cut -d. -f2-
  • -d.告诉cut用作.分隔符。
  • -f2-告诉cut将字段 2 返回到无穷大。
于 2012-07-26T16:34:39.690 回答
7

你可以grep很容易地做到这一点:

$ echo www.google.com | grep -o '[^.]*\.com'
google.com

而不是echo你必须给你的文件。

$ grep -o '[^.]*\.com$' < file

我在这里使用了正则表达式'[^.]*.com'。这意味着:给我找一个没有.in 的词 ( [^.]*),然后是.com( \.comin re)。-o关键说必须只显示找到的grep那部分。

于 2012-07-26T18:42:31.683 回答
4

用 grep--only-matching\K

您可以使用 grep 的--only-matching标志来执行此操作:

echo "www.abc.com" | grep --perl-regexp --only-matching 'www.\K.*'

可以缩短为

echo "www.abc.com" | grep -Po 'www.\K.*'

两个命令都产生

美国广播公司

使用 grep (GNU grep) 3.3。

而不是echo,我将使用此处的字符串来进一步缩短命令:

grep -Po 'www.\K.*' <<< "www.abc.com"

\K重置匹配的起点,基本上忘记了匹配的“www.”。有关更多信息,请参阅内容\K

与 grep 的积极后视

您也可以通过积极的后视来做到这一点:

grep -Po '(?<=www.).*' <<< "www.abc.com"

使用 awk 的字段分隔符-F

awk -F 'www.' <<< "www.abc.com" '$2{print $2}'

这打印

美国广播公司

如果已定义,该$2{print $2}部分将打印第二个字段。这在多行输入的情况下是必要的,以避免为不包含字段分隔符的输入行输出空行。

于 2019-05-21T10:27:02.467 回答
3

grep不用于操作/更改文本,仅用于在文本中搜索文本/模式

您应该研究类似的东西,或者sed如果您想要命令行工具来执行此操作。或者用 Python/Perl/Ruby/whatever 编写一个脚本。awkcut

于 2012-07-26T16:00:59.407 回答
1

通过在 bash 中使用内置参数扩展,您实际上可以在不调用其他程序的情况下执行此操作:

while read line; do echo ${line#*.}; done < file

Where#*.告诉外壳程序删除看起来像 0 个或多个字符的前缀,后跟一个..

您可以在此处查看带有 bash 的不同参数扩展的备忘单:

https://devhints.io/bash

于 2018-01-02T07:35:45.803 回答