【问题标题】:Bash splitting filename with space and dash in delimiterBash 在分隔符中使用空格和破折号分割文件名
【发布时间】:2013-10-19 00:43:12
【问题描述】:

我有一堆文件,我可以通过以下命令获得(其中EXT 是扩展名):

oIFS=$IFS
IFS=$'\n'

array=$(find . -iregex '.*\(EXT\)' -print)
for file in ${array[@]}; do
    echo "$file"| cut -f1 -d" - "
done

IFS=oIFS

文件名格式如下:PARTONE - PARTTWO 其中第一部分是任意字符(但not a dash [-],第二部分是任意字符并且可以包含破折号)

有没有什么办法可以让 PARTONE 和 PARTTWO 成为他们自己的变量?目前,(我相信)由于空间是分隔符的一部分,它不起作用,我收到以下错误cut: bad delimiter

【问题讨论】:

  • cut 只接受单字符分隔符

标签: regex bash shell parsing delimiter


【解决方案1】:

这是多种方法之一:

oIFS=$IFS
IFS=$'\n'

array=$(find . -iregex '.*\(EXT\)' -print)
for file in ${array[@]}; do
    PART_ONE=`echo $file | sed "s/ - .*$//"`
    PART_TWO=`echo $file | sed "s/^[^-]* - //"`
done

IFS=$oIFS

从第一部分删除./ 前缀(假设始终存在):

PART_ONE=`echo $file | sed "s/^\.\/\([^-]*\) - .*$/\1/"`

并从第二部分中删除扩展:

PART_TWO=`echo $file | sed "s/^[^-]* - \(.*\)\.[^\.]*$/\1/"`

【讨论】:

  • 完美!太感谢了!网上有没有关于sed 的好指南?
  • 另外,我如何删除PART_ONE 的前2 个字符(./)和PART_TWO 的扩展名(最后4 个字符?)
  • @LlamaGoingNorth 我为此添加了几个sed 表扬。 sed 有很多在线资源。如果您学习如何使用像vi 这样的编辑器,那么sed 将接受相同类型的命令行命令。最强大的部分可以说是正则表达式替换(这里给出了一个描述:gnu.org/software/sed/manual/html_node/Regular-Expressions.html)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
  • 2015-03-31
  • 2016-12-17
相关资源
最近更新 更多