在 sed 中排除某个字符之前的字符

Nac*_*ack 1 sed regular-expression

我有这个文件,它只打印一行。我正在使用不同的 sed 命令操作这一行。

apple orange.5678 dog cat 009 you
Run Code Online (Sandbox Code Playgroud)

我想获取“orange.5678”并包含“你”并忽略其他所有内容。我希望它看起来像下面

orange.5678 you
Run Code Online (Sandbox Code Playgroud)

我不确定从哪里开始以及如何排除除“orange.5678”和“you”之外的所有内容。任何帮助都会很棒!

Zan*_*nna 7

$ sed -r 's/.* ([^ ]+\.[^ ]+).* ([^ ]+)$/\1 \2/' orange
orange.5678 you
Run Code Online (Sandbox Code Playgroud)

解释

  • -r 使用扩展正则表达式
  • s/old/new替换oldnew
  • .* 任意数量的任意字符
  • (some characters)保存some characters以供稍后替换时参考
  • [^ ]+ 一些不是空格的字符
  • \. 文字点
  • $ 行结束
  • \1 对已保存模式的反向引用

所以s/.* ([^ ]+\.[^ ]+).* ([^ ]+)$/\1 \2/意味着,将行上的任何内容匹配到一些非空格字符之前的空格.,然后是 a之后的一些非空格字符(将这些字符保存在 的两侧.),然后匹配任何字符并保存最后一组行上的非空格字符,并用空格分隔的两个保存的模式替换整个匹配