我希望 sed 命令处理目录中的所有文件并将结果输出到新文件中。如果 f 是 val1.txt,则输出文件的名称应该是 val1_ending.txt - 这就是我尝试使用 echo 和 sed 执行的操作,但它不起作用。任何帮助,将不胜感激。谢谢你!
files= ls *.txt
echo "${files}"
for f in ${files}$
do
echo $f
sed -n -e 's/Trial End/&/p' $f>` echo $f | sed 's/.txt$/_ended.txt/g' `
done
在我的输入文件中,行如下:
3413476 999.3 549.3 1876.0 32768.0
3413477 1000.7 549.6 1880.0 32768.0
3413478 999.3 551.1 1875.0 32768.0
INPUT 3413485 127
END 3413485 SAMPLES EVENTS RES 59.84 45.82
MSG 3413491 Trial End 2
MSG 3414099 RECCFG CR 1000 0 0 R
在输出中,我想要找到模式“Trial End”的所有行:
MSG 3411256 Trial End 1
MSG 3413491 Trial End 2
MSG 3415678 Trial End 3
MSG 3417842 Trial End 4
MSG 3420114 Trial End 5
答案1
for file in *.txt; do
grep 'Trial End' "$file" >> "${file%.txt}_ended.txt"
done
我使用的>>
不是>
只是以防万一任何文件*_ended.txt
已经存在 ->>
将附加到文件而不是截断和覆盖它。
另一件事是它不太可重用。如果您已经运行过一次,那么您将拥有filename_ended.txt
以下文件匹配模式并进行处理,您就会得到filename_ended_ended.txt
文件。
您最好对这些文件使用另一个扩展名,以防止将来出现这种潜在的麻烦(顺便说一句,扩展名在 Unix 世界中并不重要)。
for file in *.txt; do grep 'Trial End' "$file" >> "$file.ended"; done
答案2
使用 grep 怎么样?请尝试以下操作:
for f in *.txt; do
out=$(echo ${f} | sed 's/.txt$/_ended.txt/')
grep 'Trial End' $f > $out
done