根据文件名修改文本文件,对文件夹中的所有文件重复
Modify text file based on file's name, repeat for all files in folder
我有一个包含多个文件的文件夹,名称为:something_1001.txt; something_1002.txt; something_1003.txt;等等
文件里面有一些文本。当然每个文件都有不同的文本,但结构总是相同的:一些用字符串“>TEXT”标识的行,这是我感兴趣的。
所以我的目标是:
- 对于文件夹中的每个文件,读取文件名并提取“_”和“.txt”之间的数字
- 修改此特定文件中包含字符串“>TEXT”的所有行,使其成为“>{NUMBER}_TEXT”
- 例如:文件"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 脚本,但它不起作用。好像有语法错误和循环错误,但我想不通在哪里。
非常欢迎任何帮助!
这里有两个问题。一是你的循环语法错误;另一个是您在 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
的值,并修剪了 prefix
和 suffix
分别关闭。
顺便说一句,避免大写变量名,因为它们是为系统使用保留的,并注意 double-quote 任何内容可能包含 shell 元字符的变量。
我有一个包含多个文件的文件夹,名称为:something_1001.txt; something_1002.txt; something_1003.txt;等等 文件里面有一些文本。当然每个文件都有不同的文本,但结构总是相同的:一些用字符串“>TEXT”标识的行,这是我感兴趣的。
所以我的目标是:
- 对于文件夹中的每个文件,读取文件名并提取“_”和“.txt”之间的数字
- 修改此特定文件中包含字符串“>TEXT”的所有行,使其成为“>{NUMBER}_TEXT”
- 例如:文件"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 脚本,但它不起作用。好像有语法错误和循环错误,但我想不通在哪里。
非常欢迎任何帮助!
这里有两个问题。一是你的循环语法错误;另一个是您在 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
的值,并修剪了 prefix
和 suffix
分别关闭。
顺便说一句,避免大写变量名,因为它们是为系统使用保留的,并注意 double-quote 任何内容可能包含 shell 元字符的变量。