【问题标题】:Removing chars after second space在第二个空格后删除字符
【发布时间】:2016-03-26 22:20:00
【问题描述】:

假设我有这个文本:

eskitirim eski[Verb]-t[Verb+Caus]+[Pos]+Hr[Aor]+YHm[A1sg] : 20.4453125 eski[Verb]-t[Verb+Caus]+[Pos]+Hr[Aor]+Hm[A1sg] : 21.7978515625

我想删除第二个空格之后的所有内容。输出应该是:

eskitirim eski[Verb]-t[Verb+Caus]+[Pos]+Hr[Aor]+YHm[A1sg]

【问题讨论】:

    标签: regex bash


    【解决方案1】:

    您也可以使用简单的cut 来完成这项工作:

    ~$ echo 'eskitirim ... ' | cut -d' ' -f-2        # or -f1,2
    # eskitirim eski[Verb]-t[Verb+Caus]+[Pos]+Hr[Aor]+YHm[A1sg]
    
    ~$ echo 'eskitirim ... ' | cut -d':' -f1
    # eskitirim eski[Verb]-t[Verb+Caus]+[Pos]+Hr[Aor]+YHm[A1sg]
    

    【讨论】:

      【解决方案2】:

      您可以使用捕获组来捕获第二个空格之前的所有内容:

      (.*?\s.*?)\s.*
      

      然后用第一个捕获组匹配替换所有内容。

      Example Here

      所以(.*?\s.*?)\s.* 替换为\1 会输出:

      eskitirim eski[Verb]-t[Verb+Caus]+[Pos]+Hr[Aor]+YHm[A1sg]
      

      或者,您也可以将. 替换为\S

      (\S*\s\S*)\s.*
      

      Same output.

      【讨论】:

      • @JayGatsby echo $string | sed 's/\(\S*\s\S*\)\s.*/\1/g' 为我工作。
      • @JoshCrozier:echo $string | sed -r 's/^(\S+\s\S+)\s.*/\1/':-r 开关启用 ERE(括号和加号不需要转义)并且没有理由使用全局 g 标志
      【解决方案3】:

      如果您绝对确定格式(关于间距)将始终与您在问题中显示的完全一样,那么更简单的解决方案可能是合适的,但我会更深入地挖掘数据的语义以给出更强大的解决方案。

      1) 如果间距可能会有所不同,但您肯定只需要前两个不包含空格的序列,请使用 awk '{print $1,$2}'

      2) 如果: 很重要并且保证存在,我会使用它而不是空格来分隔您所追求的内容:awk -F: '{print $1}'

      3) 我不会推荐任何sed/regex 解决方案,除非可以有多个连续空间并且保留此类空间的确切数量至关重要。

      【讨论】:

      • 这个尝试没有结果:cat parse.txt | awk -F: '{print $1}' > out1.txt
      • 它对我有用:$ cat out1.txt-->eskitirim eski[Verb]-t[Verb+Caus]+[Pos]+Hr[Aor]+YHm[A1sg]
      • 我正在使用 osx。也许我应该在 Linux 下试试?
      猜你喜欢
      • 1970-01-01
      • 2021-12-01
      • 2017-05-06
      • 2012-10-23
      • 1970-01-01
      • 1970-01-01
      • 2021-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多