使用 sed 修改目录中的所有文件并相应地命名输出

使用 sed 修改目录中的所有文件并相应地命名输出

我希望 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

相关内容