Linux 在Unix中提取子字符串
我在Windows7上使用cygwin。我想循环遍历一个包含大约10000个文件的文件夹,并对每个文件执行信号处理工具的操作。问题是文件名中有一些多余的字符与操作不兼容。因此,我只需要提取文件名的某一部分 例如,如果文件名是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
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
标记转换为GNUsed
,则将切换到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
标记转换为GNUsed
,则将切换到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
,并不意味着这不是一个编程问题。这是一个非常明确的问题