Linux 在Unix中提取子字符串

Linux 在Unix中提取子字符串,linux,shell,unix,cygwin,filenames,Linux,Shell,Unix,Cygwin,Filenames,我在Windows7上使用cygwin。我想循环遍历一个包含大约10000个文件的文件夹,并对每个文件执行信号处理工具的操作。问题是文件名中有一些多余的字符与操作不兼容。因此,我只需要提取文件名的某一部分 例如,如果文件名是abc123456_justlike.txt.rna我需要使用abc123456_justlike.txt。我应该如何编写循环来遍历每个文件并对缩短的文件名执行操作 我尝试了cut-b1-10命令,但工具无法执行必要的操作。如果您能帮我解决这个问题,我将不胜感激。请尝试sed

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

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

我尝试了
cut-b1-10
命令,但工具无法执行必要的操作。如果您能帮我解决这个问题,我将不胜感激。

请尝试
sed

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

如果您还不熟悉正则表达式,这是一个学习正则表达式的好机会。我发现使用正则表达式操作字符串比使用诸如
cut
(或其等效工具)等工具要简单得多。

试试
sed

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


如果您还不熟悉正则表达式,这是一个学习正则表达式的好机会。我发现使用正则表达式操作字符串比使用诸如
cut
(或其等效工具)等工具要简单得多。

如果您试图从目录中提取文件名列表,请使用下面的命令

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

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

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

尝试一些shell脚本,使用${NAME%TAIL}参数替换:变量名的内容被展开,但与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

尝试一些shell脚本,使用${NAME%TAIL}参数替换:变量名的内容被展开,但与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

为什么要在方括号字符类中避开圆点?这是不需要的;它有不同的规则。顺便说一句,如果您更喜欢Perl中更高级的正则表达式,您可以说
Perl-pe's/\..[^.]*$/'
作为等价的正则表达式,尽管在本例中没有区别。使用更奇特的模式,使用BRE的
sed
语法有点冗长。谢谢,编辑。我不喜欢Perl,我也不想在这里挑起一场激烈的战争:-)正则表达式的基本原理在大多数regexp方言中几乎是一样的。另外,还有
sed-r
。问题是
sed
默认情况下,根据标准,使用基本正则表达式,其中必须使用反斜杠转义,如
\(
\\\\\\
\+
将它们转换为元字符。如果将
-E
标记转换为GNU
sed
,则将切换到Perl使用的扩展正则表达式。然而,Perl更具可移植性,因为它没有不理解ERE的版本;唉,
sed
,有。好的int.幸运的是,我还没有遇到一个不理解
-r
开关的
sed
。你想到了哪些操作系统?是什么让你如此确信
perl
将安装在那里?我还没有遇到一个理解
-r
开关的
sed
。当然,Mac OS上的操作系统没有,尽管它没有s grok
-E
。OpenBSD上的一个既不理解也不理解,因为它是POSIX sed;在AIX上是相同的。为什么要在方括号字符类中转义点?这不是必需的,它有不同的规则。顺便说一句,如果您更喜欢Perl中更奇特的正则表达式,您可以说
Perl-pe's/\.[^]*$/'
作为等价物,虽然在本例中没有区别。对于更高级的模式,使用BRE的
sed
语法有点冗长。谢谢,编辑。我不喜欢Perl而不是任何东西,我也不想在这里挑起一场火焰战:-)正则表达式的基础在大多数regexp方言中几乎是相同的。还有
sed-r
。问题是
sed
默认情况下,根据标准,使用基本正则表达式,其中必须使用反斜杠转义,如
\(
\\\\\\
\+
将它们转换为元字符。如果将
-E
标记转换为GNU
sed
,则将切换到Perl使用的扩展正则表达式。然而,Perl更具可移植性,因为它没有不理解ERE的版本;唉,
sed
,有。好的int.幸运的是,我还没有遇到一个不理解
-r
开关的
sed
。你想到了哪些操作系统?是什么让你如此确信
perl
将安装在那里?我还没有遇到一个理解
-r
开关的
sed
。当然,Mac OS上的操作系统没有,尽管它没有s grok
-E
。OpenBSD上的一个既不理解也不理解,因为它是POSIX sed;在AIX上也是如此。这个问题可能应该转移到:)@PaoloMoretti强烈反对。仅仅因为您使用的是shell工具,如
cut
sed
awk
、或
perl
,并不意味着这不是一个编程问题。这是一个非常明确的问题