根据文件名修改文本文件,对文件夹

时间:2016-01-26 09:56:26

标签: bash text sed fasta

我有一个包含多个文件的文件夹:something_1001.txt; something_1002.txt; something_1003.txt;等等 文件里面有一些文字。当然每个文件都有不同的文本,但结构总是相同的:一些用字符串“> TEXT”标识的行,这些是我感兴趣的。

所以我的目标是:

  • 对于文件夹中的每个文件,读取文件的名称并提取“_”和“.txt”之间的数字。
  • 修改此特定文件中包含字符串“> TEXT”的所有行,以使其成为“> {NUMBER} _TEXT”
  • 例如:file“something_1001.txt”;将所有包含“> TEXT”的行更改为“> 1001_TEXT”;继续文件“something_1002.txt”将包含“> TEXT”的所有行改为“> 1002_TEXT”;等

这是我到目前为止编写的代码:

for i in /folder/*.txt
NAME=`echo $i | grep -oP '(?<=something_/).*(?=\.txt)'`
do  
    sed -i -e 's/>TEXT/>${NAME}_TEXT/g' /folder/something_${NAME}.txt
done

我创建了一个小的bash脚本来运行代码,但它不起作用。似乎有语法错误和循环错误,但我无法弄清楚在哪里。

欢迎任何帮助!

1 个答案:

答案 0 :(得分:0)

这里有两个问题。一个是你的循环语法错了;另一个是你在sed脚本周围使用单引号,这会阻止shell插入你的变量。

无论如何,grep可以避免; shell具有良好的内置功能,可以提取文件的基本名称。

for i in /folder/*.txt
do  
    base=${i#/folder/something_}
    sed -i -e "s/>TEXT/>${base%.txt}_TEXT/" "$i"
done

shell的${var#prefix}${var%suffix}变量操作工具分别在$varprefix被修剪后生成suffix的值。

顺便说一下,避免使用大写的变量名,因为它们是为系统使用而保留的,并且要注意双引用任何内容可能包含shell元字符的变量。