【问题标题】:Extract part of filename while looking for file using bash [duplicate]使用bash查找文件时提取文件名的一部分[重复]
【发布时间】:2018-01-08 12:35:05
【问题描述】:

这可以简化吗??

find *.xml |  sed -n "s/\(^.*\)\.xml/\1/p"

目标是检索 xml 文件的第一部分。 我只是注意到那里有一个正则表达式重复,并认为必须有一个简化版本

【问题讨论】:

  • ls *.xml | cut -d. -f1(如果名称包含句点,则为 ls *.xml | rev | cut -d. -f2- | rev。)
  • 顺便说一句,find *.xml 本身就是(非常,非常)错误;与find . -name '*.xml' 不同,它不能正确递归。

标签: regex linux bash sed find


【解决方案1】:

不,没有简化版本。 find 是一个专门的工具——它不支持任意的文本处理。

专注于正确性的版本实际上会更多冗长,看起来像:

while IFS= read -r -d '' filename; do
  base=${filename%.xml}
  echo "Filename $filename without its extension is $base" # put your actual command here
done < <(find . -name '*.xml' -print0)

...使用 NUL 分隔的流而不是换行符分隔的流(这很容易出错,因为文件名可以包含换行符),并使用 parameter expansion 仅从尾随位置进行修剪。

【讨论】:

    【解决方案2】:

    尝试在 awk 中关注,如果这有帮助,请告诉我。

    awk 'prev && FNR==1{close(prev);print prev} FNR==1{prev=FILENAME;sub(/\..*/,"",prev);} END{print prev}' *.xml
    

    【讨论】:

      猜你喜欢
      • 2016-02-14
      • 1970-01-01
      • 2011-12-03
      • 2013-01-17
      • 1970-01-01
      • 2015-05-09
      • 2010-12-06
      • 1970-01-01
      • 2013-08-07
      相关资源
      最近更新 更多