【问题标题】:Extracting sub-strings in Unix在 Unix 中提取子字符串
【发布时间】:2012-03-05 20:00:09
【问题描述】:

我在 Windows 7 上使用 cygwin。我想遍历一个包含大约 10,000 个文件的文件夹,并对每个文件执行信号处理工具的操作。问题是文件名有一些与操作不兼容的多余字符。因此,我只需要提取文件名的一部分。

例如,如果文件名是abc123456_justlike.txt.rna,我需要使用abc123456_justlike.txt。我应该如何编写一个循环来遍历每个文件并对缩短的文件名执行操作?

我尝试了cut - b1-10 命令,但这并没有让我的工具执行必要的操作。我很感激这个问题的帮助

【问题讨论】:

  • 这个问题应该可以移到unix.stackexchange.com :)
  • @PaoloMoretti 强烈反对。仅仅因为您使用的是 cutsedawkperl 等 shell 工具,并不意味着这不是编程问题。绝对是这样的。

标签: linux shell unix cygwin filenames


【解决方案1】:

尝试一些 shell 脚本,使用 ${NAME%TAIL} 参数替换:变量 NAME 的内容被扩展,但任何与 TAIL glob 模式匹配的后缀材料都被切掉。

$ NAME=abc12345.txt.rna
$ echo ${NAME%.rna}  #

# process all files in the directory, taking off their .rna suffix
$ for x in *; do signal_processing_tool ${x%.rna} ; done

如果文件名之间存在差异,可以用大小写进行分类:

for x in * ; do
  case $x in 
     *.rna ) 
        # do something with .rna files
        ;;
     *.txt )
        # do something else with .txt files
        ;;
     * )
        # default catch-all-else case
        ;;
  esac
done

【讨论】:

【解决方案2】:

试试sed:

echo a.b.c | sed 's/\.[^.]*$//'

sed 中的s 命令执行搜索和替换操作,在这种情况下它替换正则表达式\.[^.]*$(意思是:一个点,后面跟任意数量的非点,最后的字符串)与空字符串。

如果您还不熟悉正则表达式,那么这是学习它们的好点。我发现使用正则表达式处理字符串比使用 cut(或它们的等价物)之类的工具要简单得多。

【讨论】:

  • 你为什么要转义方括号字符类中的点?那是不需要的;它有不同的规则。顺便说一句,如果你更喜欢 Perl 中更高级的正则表达式,你可以说 perl -pe 's/\.[^.]*$//' 是等价的,尽管在这种情况下它没有区别。对于更高级的模式,使用 BRE 的 sed 语法有点冗长。
  • 谢谢,已编辑。我不喜欢 Perl,而且我也不想在这里开始一场激烈的战争:-) 正则表达式的基础在大多数正则表达式方言中几乎相同。另外,还有sed -r
  • 问题是 sed 默认情况下,并且根据标准,使用 基本正则表达式,其中您必须反斜杠转义诸如 \(\| 之类的东西或\+ 让它们成为元字符。如果您将-E 标志设置为GNU sed,那将切换到Perl 使用的扩展正则表达式。然而,Perl 更便于移植,因为它没有不理解 ERE 的版本。唉,sed,有。
  • 好点。幸运的是,我还没有遇到不懂-r 开关的sed。您想到了哪些操作系统?是什么让你如此确定perl 会安装在那里?
  • 我还没有遇到一个确实理解-r开关的sed。当然,Mac OS 上的那个没有,尽管它确实很熟悉-E。 OpenBSD 上的那个既不了解,也是 POSIX sed;在 AIX 上也一样。
【解决方案3】:

如果您尝试从目录中提取文件名列表,请使用以下命令。

ls -ltr | awk -F " " '{print $9}' | cut -c1-10

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-03
    • 2011-07-21
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 2021-10-31
    • 2019-12-11
    相关资源
    最近更新 更多