正则表达式不能与 sed 一起正常工作,但可以在 regex101 中工作

Regex is not working properly with sed but works in regex101

我只是想从每行中删除第一次出现单个 space 字符之前的所有内容。 例如50G This is a Test (0000) 1234p (String).ext应该变成This is a Test (0000) 1234p (String).ext

所以我正在使用这个简单的正则表达式 - ^.+?\s(.*) 我只是试图将所有内容包装在一组中的第一个 space 字符之后,然后尝试用第一组替换整个匹配项

现在这个问题是它在 regex101 中运行良好 - https://regex101.com/r/1dAUcO/1 但是当我在终端中使用 sed 尝试相同的正则表达式时,它 returns 不同的输出。这是 sed 命令 - echo "50G This is a Test (0000) 1234p (String).ext" | sed -E 's|^.+?\s(.*)||g'

sed 正则表达式风格 POSIX 不支持 lazy/non-greedy 量词。

您可以使用

sed -E 's|^[^[:space:]]+[[:space:]]*||'

使用 GNU sed,

sed -E 's|^\S+\s*||'

an online demo:

#!/bin/bash
s="50G This is a Test (0000) 1234p (String).ext"
sed -E 's|^[^[:space:]]+[[:space:]]*||g' <<< "$s"
## => This is a Test (0000) 1234p (String).ext
sed -E 's|^\S+\s*||' <<< "$s"
## => This is a Test (0000) 1234p (String).ext

你当然可以在 perl:

中使用惰性量词
perl -pe 's/^.+?\s//'

请注意,您无需捕获字符串的其余部分即可使用反向引用将其放回去。

您正在使用这个 sed:

sed -E 's|^.+?\s(.*)||g

.+? 的意图是使其成为 惰性匹配 但是 sed (即使在 ERE 模式下)不支持惰性量词。

如果您考虑 perl 那么它将按原样工作,因为 perl 支持惰性量词:

echo "50G This is a Test (0000) 1234p (String).ext" |
perl -pe 's|^.+?\s(.*)||g'

This is a Test (0000) 1234p (String).ext

但是 我强烈建议为此使用 cut 因为你不必为使用正则表达式而烦恼,这就是 cut专为:

echo "50G This is a Test (0000) 1234p (String).ext" |
cut -d " " -f2-

This is a Test (0000) 1234p (String).ext

使用 awk 代码,您也可以尝试以下操作。

awk '
{
  val=""
  for(i=1;i<=NF;i++){
    if($i~/\([^)]*\)/){
      val=(val?val OFS:"")$(i-1) OFS $(i)
    }
  }
  print val
}
'  Input_file

说明: 为以上添加详细说明。

awk '                     ##Starting awk program from here.
{
  val=""                  ##Nullifying val here.
  for(i=1;i<=NF;i++){     ##Traversing through all fields of current line here.
    if($i~/\([^)]*\)/){   ##Checking if current field is like (...) then do following.
      val=(val?val OFS:"")$(i-1) OFS $(i)  ##Creating val which has current and previous field value in it, keep appending its value to it.
    }
  }
  print val               ##Printing val here.
}
'  Input_file             ##mentioning Input_file name here.