【问题标题】:Deleting the first string on the first line of two consecutive lines with identical stings at the beginning删除开头相同字符串的两个连续行的第一行的第一个字符串
【发布时间】:2019-09-17 04:23:27
【问题描述】:

我正在处理文本文件(从 facebook 组复制和粘贴)我已经使用 sed 命令组删除了所有字符串“Like”“Comment”评论编号等。我留下的线条看起来像这样:

Jane Doe
Jane Doe Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Donec ac urna ut quam sagittis placerat id vitae justo. 
John Doe
John Doe Maecenas id justo tempus, auctor velit in, porta nibh. 
John Doe
John Doe Maecenas id justo tempus, auctor velit in, porta nibh. 
Fred Crun
Fred Crun Maecenas id justo tempus, auctor velit in, porta nibh. Mauris bibendum et ligula molestie faucibus. Nullam feugiat tristique sapien non fringilla. 
Fred Crun
Fred Crun Maecenas id justo tempus, auctor velit in, porta nibh. Mauris bibendum et ligula molestie faucibus. Nullam feugiat tristique sapien non fringilla.
Frank Zappa
Frank Zappa Suspendisse malesuada libero id tortor scelerisque feugiat. Suspendisse vel feugiat est. Vestibulum vel nisl magna. Aenean viverra diam vel vulputate pulvinar. In hac habitasse platea dictumst.

我正在寻找 sed 或其他 Unix 实用程序的正则表达式,它将删除行上的名称,后面没有其他文本,使行看起来像这样:

Jane Doe Lorem ipsum dolor sit amet, consectetur adipiscing elit.
John Doe Maecenas id justo tempus, auctor velit in, porta nibh.
John Doe Maecenas id justo tempus, auctor velit in, porta nibh.
Fred Crun Maecenas id justo tempus, auctor velit in, porta nibh. Mauris bibendum et ligula molestie faucibus. Nullam feugiat tristique sapien non fringilla
Fred Crun Maecenas id justo tempus, auctor velit in, porta nibh. Mauris bibendum et ligula molestie faucibus. Nullam feugiat tristique sapien non fringilla.
Frank Zappa Suspendisse malesuada libero id tortor scelerisque feugiat. Suspendisse vel feugiat est. Vestibulum vel nisl magna. Aenean viverra diam vel vulputate pulvinar. In hac habitasse platea dictumst.

这里是颂歌。

。我查看了uniq 和gvim 中的几个regep 示例,但我看不到实现目标的方法。名称可以由 3 个单词组成。

【问题讨论】:

  • 不确定我是否完全理解,但如果您只打印奇数行号,那么您可以使用:awk 'NR%2==1 {print $0}' $filename 希望这有帮助。
  • 您好,我正在尝试删除包含重复名称但没有其他文本的行。请参阅我对问题的编辑以获取正在处理的文件的更准确版本。感谢您的建议,我尝试使用上面的文字,它返回了 Jane Doe John Doe
  • edit 您的问题是根据您提供的输入显示您期望的输出,而不是您未提供的其他输入的其他输出。还要说明名称是总是 2 个单词还是可以是多个单词,例如 Arthur Conan Doyle。
  • 完成@Ed Morton
  • 那你怎么能从一个 2 个单词的名字后面跟着 1 个单词的“extra text”中分辨出什么是 3 个单词的名字呢?为什么Donec ac urna ut quam sagittis placerat id vitae justo. 不包含在输出中?如果它前面有一行 Donec ac urna ut quam sagittis placerat id vitae,那么 your accepted answer 会打印它 - 这真的是您想要的行为吗?

标签: text vim sed


【解决方案1】:

这可能对你有用(GNU sed):

sed -E 'N;/^(.*)\n\1./!P;D' file

在整个文件中打开一个两行窗口。

如果第一行的全部内容与第二行的开头相同,则不要打印。

删除第一行并重复。

【讨论】:

  • 我从不知道反向引用可用作正则表达式本身的一部分。
【解决方案2】:

在 Vim 中,您可以执行以下操作:

:%s/^\(.*\)\n\1/\1

它查找一行,然后是 \n 和同一行(可能还有一些后面的内容,未指定)并将其替换为找到的模式,删除第一部分。

【讨论】:

    【解决方案3】:

    如果您的数据在 d 文件中,请在 gnu sed 上尝试:

    sed -E '/^\w+\s\w+\s*$/{N;s/([^\n]+)\n(\1.+)/\2/;b};d' d
    

    【讨论】:

      猜你喜欢
      • 2011-06-24
      • 2013-05-21
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-05
      • 1970-01-01
      相关资源
      最近更新 更多