我有一个包含多个文件的文件夹: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脚本来运行代码,但它不起作用。似乎有语法错误和循环错误,但我无法弄清楚在哪里。
欢迎任何帮助!
答案 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}
变量操作工具分别在$var
和prefix
被修剪后生成suffix
的值。
顺便说一下,避免使用大写的变量名,因为它们是为系统使用而保留的,并且要注意双引用任何内容可能包含shell元字符的变量。