更改 sed 中许多文件的最后一行 - sed 仅更改第一行

Changing last line in many files in sed - sed only change in first

这是我的脚本

#!/bin/bash
for num in {1..100}; 
do 
    sed '$s/ 6.36535    23.3762512.09434/   6.76889  21.76071  12.19032/' eq8_$num.gro | tee eq9_$num.gro
done

我要更换 " 6.36535 23.3762512.09434" 到 " 6.76889 21.76071 12.19032" (白色 space 在这种情况下很重要,文件的行数不同,这是每个文件的最后一行)。

Sed 只处理第一个文件。 输入示例

eq8_1.gro

900 mgdg molecules in water t= 600000.00000 step= 400000000
177255
  227BGL     C529155   4.134  15.788   5.556
  227BGL     H529156   4.186  15.879   5.529
19144SOL     OW73518   0.911  13.325   6.427
19144SOL    HW173519   0.879  13.256   6.485
20389SOL     OW77253   0.644  14.144   5.376
20389SOL    HW177254   0.712  14.203   5.344
 6.36535    23.3762512.09434

eq8_2.gro

900 mgdg molecules in water t= 600000.00000 step= 400000000
177255
19922SOL    HW175853   4.186  14.169   5.941
19922SOL    HW275854   4.071  14.076   5.973
19924SOL     OW75858   1.466  20.721   5.803
19924SOL    HW175859   1.489  20.642   5.852
 6.36535    23.3762512.09434

输出示例

eq9_1.gro

900 mgdg molecules in water t= 600000.00000 step= 400000000
177255
  227BGL     C529155   4.134  15.788   5.556
  227BGL     H529156   4.186  15.879   5.529
19144SOL    HW173519   0.879  13.256   6.485
19144SOL    HW273520   1.007  13.318   6.431
20389SOL    HW177254   0.712  14.203   5.344
20389SOL    HW277255   0.577  14.201   5.413
   6.76889  21.76071  12.19032

eq9_2.gro(最后一行没变,为什么?)

900 mgdg molecules in water t= 600000.00000 step= 400000000
177255
19922SOL     OW75852   4.097  14.168   5.977
19922SOL    HW175853   4.186  14.169   5.941
19924SOL     OW75858   1.466  20.721   5.803
19924SOL    HW175859   1.489  20.642   5.852
 6.36535    23.3762512.09434

我也尝试不同的方法

#!/bin/bash
for num in {1..100}; 
do 
    sed -i '$s/ 6.36535    23.3762512.09434/   6.76889  21.76071  12.19032/' eq8_$num.gro
done

也不行。

如果您不知道如何在 sed 中执行此操作,也许您知道如何在 awk 中执行此操作?

您是否尝试过 sed -i 's/Pattern1/Pattern2/g' 最后的 g 对文件中所有匹配的模式进行了全局替换。

这可能对你有用(GNU sed 和并行):

parallel -q sed -s '$s/ 6.36535    23.3762512.09434/   6.76889  21.76071  12.19032/' ::: eq8_{1..100}.gro

这会将上述 sed 替换命令应用于从 eq8_1.groeq8_100.gro 的 100 个文件的最后一行。

输出将到达标准输出并可以被捕获> outFile

N.B。原文件不会被修改。

如果原文件需要原地修改,使用:

parallel -q sed -i.backup '$s/ 6.36535    23.3762512.09434/   6.76889  21.76071  12.19032/' ::: eq8_{1..100}.gro

要保留原始文件并生成修改后的新文件,请使用:

parallel sed -s \''$s/ 6.36535    23.3762512.09434/   6.76889  21.76071  12.19032/'\' \> {.}.new.txt ::: eq8_{1..100}.gro

您可能需要确保文件末尾有换行符。 sed 实现通常对 $ 的含义很挑剔。考虑例如

sed -i.bak -e '$a\' file

如果您的 shell 允许,甚至更好:

[ -n "$(tail -c1 file)" ] && printf '\n' >>file