根据文件名修改文本文件,对文件夹中的所有文件重复

Modify text file based on file's name, repeat for all files in folder

我有一个包含多个文件的文件夹,名称为:something_1001.txt; something_1002.txt; something_1003.txt;等等 文件里面有一些文本。当然每个文件都有不同的文本,但结构总是相同的:一些用字符串“>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 脚本,但它不起作用。好像有语法错误和循环错误,但我想不通在哪里。

非常欢迎任何帮助!

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

grep反正是可以避免的; shell 具有很好的 built-in 提取文件基本名称的功能。

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} 变量操作工具生成 $var 的值,并修剪了 prefixsuffix分别关闭。

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