获取sed中过滤部分的第一个字母

获取sed中过滤部分的第一个字母,sed,Sed,我有一个文件名,例如15736--1_brand-new-image.jpg 我的目标是得到后面的第一个字母,在本例中是b 使用s/\(.*\)\(.*\)$/\2/我能够提取全新图像。jpg 这部分是基于在上找到的信息 我已经找到了,但无法将两者结合起来 为了验证我使用的sed语句 如何在我筛选的部分上组合一个新的sed语句以获得第一个字母?对于您显示的示例,请尝试以下内容 echo "15736--1_brand-new-image.jpg" | sed 's/[^_]*

我有一个文件名,例如
15736--1_brand-new-image.jpg

我的目标是得到
后面的第一个字母,在本例中是
b

使用
s/\(.*\)\(.*\)$/\2/
我能够提取
全新图像。jpg

这部分是基于在上找到的信息

我已经找到了,但无法将两者结合起来

为了验证我使用的sed语句


如何在我筛选的部分上组合一个新的sed语句以获得第一个字母?

对于您显示的示例,请尝试以下内容

echo "15736--1_brand-new-image.jpg" | sed 's/[^_]*_\(.\).*/\1/'
说明:只需使用
sed的替换操作
,然后查看
的第一个出现处,然后将下一个1字符保存到back reference中并提及。*将涵盖它之后的所有内容,在替换时,只需使用第一个后参考值替换所有内容,该值将位于第一个后参考值之后。在本例中,其
b

解释:以下仅用于解释目的

sed '            ##Starting sed program from here.
s/               ##using s to tell sed to perform substitution operation.
[^_]*_\(.\).*    ##using regex to match till 1st occurrence of _ then using back reference \(.\) to catch value in temp buffer memory here.
/\1/             ##Substituting whole line with 1st back reference value here which is b in this case.
'

如果有两个连续的
\uuuuu

如果要匹配第一个单词字符,而不匹配
\uuu
,也可以使用

echo "15736--1_brand-new-image.jpg" | sed 's/[^_]*_\([[:alnum:]]\).*/\1/'
输出

b

这可能适合您(GNU-sed):

由于这是一种过滤类型的操作,因此仅当存在正匹配时,才使用
-n
选项进行打印

从行首开始匹配第一个
,然后丢弃任何非字母字符,直到一个字母字符,最后丢弃任何其他字符

如果存在匹配项,则打印结果


n.b.锚定匹配到行的起始,阻止包含一个以上字符的结果,即考虑字符串<代码> 123y466ABC 否则可能导致<代码> 4 < /代码>或<代码> 123A A/COD> < < /P>谢谢解释。对我来说,仍然很难区分sed表达式中的哪一部分属于描述的哪一部分。@BasvanDijk,我已经对程序进行了扩展解释,如果您有任何疑问,请务必告诉我,干杯。太好了!我们到底要替换什么?这并不是说我们更换了什么东西,对吗?@BasvanDijk,从value

15736--1_brand-new-image.jpg
b
我们按照所示的样本进行更换,所以当我们使用反向引用时,它发生在v上[line value
15736--1_brand-new-image.jpg
,如果有任何疑问,请告诉我。或者,在POSIX外壳上,您可以尝试以下操作:
file=“15736--1_brand-new-image.jpg”;letter=$(printf%.1s“${file.*.}”);echo$letter
@M.NejatAydin nice one。我还提出了一个nodejs备选方案:
node-e“console.log(process.argv[1].split(”)[1][0])”15736--1_brand-new-image.jpg
sed -nE 's/^[^_]*_[^[:alpha:]]*([[:alpha:]]).*/\1/p' file