【发布时间】:2019-06-01 17:03:01
【问题描述】:
我还没有找到一种方法在 sed 命令中使用这个正则表达式 - .+?(?=,) 来提取这个字符串的一部分(使用第一个字符实例的 Lookbehind)。
用简单的英语,我想提取位于第一个逗号之前的字符串部分。由于我计划将来提取字符串的特定文件名,因此我不能依赖 cut 命令(我最终将不得不使用 sed 命令),:-
name='ERROR 1: /home/rphillips/Desktop/empties/BN23_2303.tif, band 1: 无法计算统计数据,采样中找不到有效像素。'
这些是我使用过的变体,包括一个有效的测试 - sed 's/band/rose/'。然而,我使用的其他变体(如下所示)将空格作为输出。
while read -r line; do
name="$line"
echo $name
#file_path=$(echo $name | cut -d "," -f 1)
#file_path=$(echo $name | sed -e '/s\/.+?(?=,)///')
#file_path=$(echo $name | sed 's/band/rose/')
file_path=$(echo $name | sed '/s\/.+?(?=, )///')
#file_path=$(echo $name | grep -P '.+?(?=,)')
#file_path=$(echo $name | sed
#file_path=$(echo $name | awk '/.+?(?=,)/{print $name}'
echo $file_path
done < "$filename"
预期结果 - 错误 1:/home/rphillips/Desktop/empties/BN25_2303.tif
实际结果 - '很多空间'
我还注意到,根据 Regex101 网站,我使用的正则表达式具有不同的“匹配”,具体取决于我是在 Windows 上使用 Firefox 还是 Ubuntu 16.04LTS
Windows - https://regex101.com/r/WWGf8F/1 Ubuntu - https://regex101.com/r/NpL2Oa/1
我不确定这是否导致 sed -e 无法识别表达式?
我已经将这些引用用于上面代码中使用的不同表达式
https://likegeeks.com/regex-tutorial-linux/
How to match "anything up until this sequence of characters" in a regular expression?
【问题讨论】:
-
sed 's/,.*//'将带来所需的输出,尽管我不确定这是否是您想要做的。你会用 English 指定你想要执行的过程吗,因为你的命令sed '/s\/.+?(?=, )///'不起作用并且不清楚你想要做什么。请注意,我不是反对者。 -
同意,
sed 's/,.*$//'或sed 's/^\([^,][^,]*\).*$/\1/'。要么做你想做的事。 (或grep -o '^[^,]*'或awk -F, '{print $1}') -
sed仅保证支持 BRE(“POSIX 基本正则表达式”),并且许多版本还提供了访问 ERE 语法的扩展。 Lookahead 和lookbehind 是PCRE 扩展,不是任何一个标准的一部分。见pubs.opengroup.org/onlinepubs/9699919799/utilities/sed.html -
顺便说一句,
echo $name本质上是错误的——参见BashPitfalls #14。按优先顺序使用<<<"$name"、printf '%s\n' "$name"或echo "$name"带引号。 -
...你不需要
sed来做一些简单的事情,比如在字符串中修剪逗号后面的所有内容。如果string=foo,bar,则${string%%,*}将评估为foo。