【问题标题】:getting the first letter of an filtered part in sed在 sed 中获取过滤部分的第一个字母
【发布时间】:2021-03-05 12:57:52
【问题描述】:

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

我的目标是获取_ 之后的第一个字母,在这种情况下为b

使用s/\(.*\)\_\(.*\)$/\2/ 我可以提取brand-new-image.jpg

这部分基于https://www.oncrashreboot.com/use-sed-to-split-path-into-filename-extension-and-directory上的信息

我已经找到get first letter of words using sed,但未能将两者结合起来。

为了验证我的 sed 语句,我使用了 https://sed.js.org/

如何在已过滤的部分上组合新的 sed 语句以获取第一个字母?

【问题讨论】:

  • 或者,在 POSIX shell 上,您可以尝试这样的操作:file="15736--1_brand-new-image.jpg"; letter=$(printf %.1s "${file#*_}"); echo $letter
  • @M.NejatAydin 不错。我还想出了一个 nodejs 替代方案:node -e "console.log(process.argv[1].split('_')[1][0]);" 15736--1_brand-new-image.jpg

标签: sed


【解决方案1】:

您是否可以使用您展示的示例尝试以下操作。

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

解释:只需使用sed 的替换操作,然后查看_ 的第一次出现,然后将下一个字符保存到反向引用中并提及 .* 将覆盖它之后的所有内容,而替换只是用第一个后​​向参考值替换所有内容,这将在第一个 _ 之后,在这种情况下为 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.
'

【讨论】:

  • 感谢您的解释,对我来说仍然很难区分 sed 表达式中的哪个部分属于描述的哪个部分。
  • @BasvanDijk,我已经对程序进行了扩展解释,如果您对此有任何疑问,请告诉我,干杯。
  • 太棒了!我们究竟在替换什么?是不是我们换了个东西对不对?
  • @BasvanDijk,从值 15736--1_brand-new-image.jpgb,我们将按照所示示例进行替换,因此当我们使用反向引用时,它发生在 v[行值 15736--1_brand-new-image.jpg,如果有,请告诉我同问,干杯。
【解决方案2】:

如果有两个连续的__,使用.\w 也可以匹配_

如果你想匹配第一个单词字符而不匹配_,你也可以使用

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

输出

b

【讨论】:

    【解决方案3】:

    这可能对你有用(GNU sed):

    sed -nE 's/^[^_]*_[^[:alpha:]]*([[:alpha:]]).*/\1/p' file
    

    由于这是一个过滤类型的操作,所以使用-n 选项仅在存在肯定匹配时打印。

    匹配从行首开始的第一个_,然后丢弃所有非字母字符直到一个字母字符,最后丢弃所有其他字符。

    如果有匹配则打印结果。

    注意将匹配锚定到行首,防止结果包含多个字符,即考虑字符串123_456_abc 可能会导致4123_a

    【讨论】:

      猜你喜欢
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-11
      相关资源
      最近更新 更多