Bash

使用 sed 修改目錄中的所有文件並相應地命名輸出

  • March 16, 2016

我希望 sed 命令處理目錄中的所有文件並將結果輸出到一個新文件中。如果 f 是 val1.txt,則輸出文件的名稱應該是 val1_ended.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

在輸出中,我想要找到“試用結束”模式的所有行:

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
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

引用自:https://unix.stackexchange.com/questions/270085