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经验.
您不在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在取代模式)\+重复意味着至少一次匹配)i标记)g标志)正如其他人所指出的,grep不太适合此任务,sed是一个不错的选择,或者如果文本排序良好,则简单的cut输入可能会更容易:
echo www.abc.com | cut -d. -f2-
Run Code Online (Sandbox Code Playgroud)
-d.告诉cut用作.分隔符。-f2-告诉cut将字段 2 返回到无穷大。--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 -Po '(?<=www\.).*' <<< 'www.abc.com'
Run Code Online (Sandbox Code Playgroud)
-Fawk -F 'www\\.' '$2{print $2}' <<< 'www.abc.com'
Run Code Online (Sandbox Code Playgroud)
这打印
abc.com
$2{print $2}如果已定义,该部件将打印第二个字段。在多行输入的情况下这是必要的,以避免为不包含字段分隔符的输入行输出空行。
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 的内置参数扩展可能会很有用:
input="www.abc.com"; after=${input#"www."}; echo "$after"
Run Code Online (Sandbox Code Playgroud)
如果输入字符串不以“www.”开头,这将打印整个字符串。
您可以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必须只显示发现的一部分.