如何使用grep删除单词前缀?

Jur*_*y A 9 regex linux shell sed

如何使用grep删除单词的开头?例如:我有一个包含以下内容的文件:

www.abc.com
Run Code Online (Sandbox Code Playgroud)

我只需要这部分

abc.com
Run Code Online (Sandbox Code Playgroud)

对不起基本问题.但没有Linux经验.

sas*_*nin 9

您不在grepUnix shell中编辑字符串,grep通常用于查找或删除文本中的某些行.你宁愿使用sed:

$ echo www.example.com | sed 's/^[^\.]\+\.//'
example.com
Run Code Online (Sandbox Code Playgroud)

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

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

一个例子

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

\documentclass{article}
\begin{document}
www.example.com
example.com www.another.domain.com
\end{document}
Run Code Online (Sandbox Code Playgroud)

然后你可以用这个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}
Run Code Online (Sandbox Code Playgroud)

请注意:

  • 允许符号后跟一个点的常见序列匹配 [a-z0-9-]\+\.
  • 我用在正则表达式组(它的一部分内\(\)),以指示所述第一和所述URL的第二部分,和余替换以其第二组整个匹配(\2在取代模式)
  • 域名应至少为3级.com域名(每次\+重复意味着至少一次匹配)
  • 搜索不区分大小写(最后i标记)
  • 它可以做的不仅仅是每行匹配(最后g标志)


Tho*_*hor 9

正如其他人所指出的,grep不太适合此任务,sed是一个不错的选择,或者如果文本排序良好,则简单的cut输入可能会更容易:

echo www.abc.com | cut -d. -f2-
Run Code Online (Sandbox Code Playgroud)
  • -d.告诉cut用作.分隔符。
  • -f2-告诉cut将字段 2 返回到无穷大。


Mat*_*aun 6

与 grep--only-matching\K

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

echo 'www.abc.com' | grep --perl-regexp --only-matching 'www\.\K.*'
Run Code Online (Sandbox Code Playgroud)

可以缩短为

echo 'www.abc.com' | grep -Po 'www\.\K.*'
Run Code Online (Sandbox Code Playgroud)

两个命令都会产生

abc.com

使用 grep (GNU grep) 3.3。

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

grep -Po 'www\.\K.*' <<< 'www.abc.com'
Run Code Online (Sandbox Code Playgroud)

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

使用 grep 的积极向后查找

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

grep -Po '(?<=www\.).*' <<< 'www.abc.com'
Run Code Online (Sandbox Code Playgroud)

使用 awk 的字段分隔符-F

awk -F 'www\\.' '$2{print $2}' <<< 'www.abc.com'
Run Code Online (Sandbox Code Playgroud)

这打印

abc.com

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

与 sed

sed --regexp-extended --quiet 's/www\.(.*)/\1/p' <<< 'www.abc.com'
Run Code Online (Sandbox Code Playgroud)

括号形成一个组,将捕获“www.”之后的所有内容。使用\1我们引用该组并/p打印它。

选项--regexp-extended--quiet具有更短的等效项-E-n

sed -E -n 's/www\.(.*)/\1/p' <<< 'www.abc.com'
Run Code Online (Sandbox Code Playgroud)

正如Vladimir Nesterenco在删除的答案中指出的那样,建议在所有这些正则表达式中使用反斜杠转义点,以避免匹配以“www”开头后跟任意字符(而不仅仅是点)的字符串。否则,例如,您需要从“wwwXabc.com”中提取“abc.com”。

根据您的输入文本,您可能需要更改正则表达式以确保仅匹配出现的“www”。在一行的开头

^www\.
Run Code Online (Sandbox Code Playgroud)

与 Bash 的参数扩展

如果您的输入仅包含一行,Bash 的内置参数扩展可能会很有用:

input="www.abc.com"; after=${input#"www."}; echo "$after"
Run Code Online (Sandbox Code Playgroud)

如果输入字符串不以“www.”开头,这将打印整个字符串。


Igo*_*bin 5

您可以grep轻松地执行此操作:

$ echo www.google.com | grep -o '[^.]*\.com'
google.com
Run Code Online (Sandbox Code Playgroud)

而不是echo你必须提供你的文件.

$ grep -o '[^.]*\.com$' < file
Run Code Online (Sandbox Code Playgroud)

我在这里使用正则表达式'[^.]*.com'.这意味着:找到一个没有.它的单词([^.]*),然后.com(\.com重新).该-o键说,grep必须只显示发现的一部分.