在Unix中提取子字符串

时间:2012-03-05 20:00:09

标签: linux shell unix cygwin filenames

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

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

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

3 个答案:

答案 0 :(得分:2)

尝试sed

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

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

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

答案 1 :(得分:2)

使用$ {NAME%TAIL}参数替换尝试一些shell脚本:扩展变量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 :(得分:0)

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

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