如何使用 grep 删除单词的开头?例如:我有一个文件,其中包含:
www.abc.com
我只需要那部分
abc.com
对不起,基本问题。但是没有使用Linux的经验。
您不能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
在替换模式中)\+
重复意味着至少一个匹配项)i
最后标记)g
最后的标志)正如其他人所指出的,grep
它不太适合此任务,sed
是一个不错的选择,或者如果文本井井有条,那么简单cut
的输入可能会更容易:
echo www.abc.com | cut -d. -f2-
-d.
告诉cut
用作.
分隔符。-f2-
告诉cut
将字段 2 返回到无穷大。你可以grep
很容易地做到这一点:
$ echo www.google.com | grep -o '[^.]*\.com'
google.com
而不是echo
你必须给你的文件。
$ grep -o '[^.]*\.com$' < file
我在这里使用了正则表达式'[^.]*.com'。这意味着:给我找一个没有.
in 的词 ( [^.]*
),然后是.com
( \.com
in re)。-o
关键说必须只显示找到的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 -Po '(?<=www.).*' <<< "www.abc.com"
-F
awk -F 'www.' <<< "www.abc.com" '$2{print $2}'
这打印
美国广播公司
如果已定义,该$2{print $2}
部分将打印第二个字段。这在多行输入的情况下是必要的,以避免为不包含字段分隔符的输入行输出空行。
grep
不用于操作/更改文本,仅用于在文本中搜索文本/模式
您应该研究类似的东西,或者sed
如果您想要命令行工具来执行此操作。或者用 Python/Perl/Ruby/whatever 编写一个脚本。awk
cut
通过在 bash 中使用内置参数扩展,您实际上可以在不调用其他程序的情况下执行此操作:
while read line; do echo ${line#*.}; done < file
Where#*.
告诉外壳程序删除看起来像 0 个或多个字符的前缀,后跟一个.
.
您可以在此处查看带有 bash 的不同参数扩展的备忘单: