正则表达式不能与 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*||'
#!/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.
我只是想从每行中删除第一次出现单个 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*||'
#!/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.