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

时间:2012-07-26 15:56:29

标签: regex linux shell sed

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

www.abc.com

我只需要部分

abc.com

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

7 个答案:

答案 0 :(得分:7)

您不在Unix shell中使用grep编辑字符串,grep通常用于查找或删除文本中的某些行。您宁可使用sed代替:

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

您需要学习正则表达式to use it effectively

如果你传递-i参数,那么sed也可以就地编辑文件(修改文件),但是要小心,如果你写了错误的sed命令并且使用{,你很容易丢失数据{1}}旗帜。

一个例子

根据您的评论猜测您有TeX文档,并且您想要删除所有.com域名的第一部分。如果是您的文档-i

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-]\+\.\(中的部分)来指示URL的第一部分和第二部分,并将整个匹配替换为其第二组(替代模式中的\)
  • 域名应至少为3级.com域名(每\2次回复至少表示一次匹配)
  • 搜索不区分大小写(最后为\+标志)
  • 它可以比每行匹配更多(i标志到底)

答案 1 :(得分:5)

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

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

您必须提供文件,而不是echo

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

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

答案 2 :(得分:3)

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

如果您需要命令行工具,则应该查看sedawkcut之类的内容。或者用Python / Perl / Ruby等编写脚本。

答案 3 :(得分:2)

正如其他人所指出的那样,grep不适合这项任务,sed是一个不错的选择,或者如果文字订购得很好,简单的cut可能更容易类型:

echo www.abc.com | cut -d. -f2-
  • -d.告诉cut使用.作为分隔符。
  • -f2-告诉cut将字段2返回无限。

答案 4 :(得分:0)

虽然 sed awk 剪切甚至 grep 都可以解决问题,但我认为 grep 不是一个好选择。

  • grep 是一个命令行实用程序,用于搜索与正则表达式匹配的行的纯文本数据集。
  • sed awt 等实用程序是存在的,用于逐行处理字符串。

答案 5 :(得分:0)

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

func textViewShouldBeginEditing(_ textView: UITextView) -> Bool {
    let keyboardToolBar = UIToolbar()
    keyboardToolBar.backgroundColor = .cyan
    keyboardToolBar.sizeToFit()
    let btn1 = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(self.doneBtnAction))
    keyboardToolBar.items = [btn1]
    textView.inputAccessoryView = keyboardToolBar
    return true
}

@objc func doneBtnAction(sender: UIBarButtonItem) {
    aTextView.resignFirstResponder()
}

while read line; do echo ${line#*.}; done < file 告诉shell删除前缀为0或更多字符后跟#*.的前缀。

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

https://devhints.io/bash

答案 6 :(得分:0)

您可以使用positive lookbehind和grep的--only-matching标志来做到这一点:

echo "www.abc.com" | grep --perl-regexp --only-matching '(?<=www\.).*'

可以减少为

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

两种产品

  

abc.com

使用grep(GNU grep)3.3。