在shell脚本中转义sed



我希望使用shell脚本和sed在我的结果txt文件中放入一些数字,比如:

for i in 0.88 0.90 0.92 0.94 0.96 0.98 1.00 1.02 1.04 1.06 1.08 1.10 1.12; do
    a_original_A=5
    amod=`bc <<< "$i*$a_original_A"`
    sed -s -i '1i|/"list_number_$i  $amod  $amod  $amod  90  90  90" ' list_${i}.txt
    sed -s -i '1i12' list_${i}.txt
done

但它没有起作用。我试着在逃跑时使用sed,但失败了;我试过

sed -s -i '1i|/"list_number_$i  ${amod}  ${amod}  ${amod}  90  90  90" ' list_${i}.txt

但这也于事无补。

在这里,我希望制作13个数量的txt文件,并希望在13个txt文件的第二行放上变化的数字。例如,list_0.88.txt包含

12
list_number_0.88    4.4   4.4   4.4   90   90   90

文件开头的那两行。4.4来自5*0.88。同样,我希望制作13个文件,在第二行有不同的编号。如何在sed命令中使用数字?

注意:已经有13个非空文本文件;我希望添加这些新行作为每个现有文件的前两行。

你到底在做什么,试图使用shell加sed加bc来实现这一点???通用的UNIX文本操作工具是awk:

awk 'BEGIN {
    a_original_A = 5
    split("0.88 0.90 0.92 0.94 0.96 0.98 1.00 1.02 1.04 1.06 1.08 1.10 1.12",nums)
    for (i in nums) {
        num = nums[i]
        out = "list_" num ".txt"
        amod = num * a_original_A
        print "12" > out
        print "list_number_" num, amod, amod, amod, 90, 90, 90" > out
        close(out)
    }
}'

请在下面写下您的评论,如果您的目录中已经有文件,那么使用GNU awk(我认为您在示例中使用GNU sed后已经有了),它将是:

awk -i inplace '
BEGIN { a_original_A = 5 }
FNR==1 {
    num = gensub(/.*_/,"",1,FILENAME)
    amod = num * a_original_A
    print "12"
    print "list_number_" num, amod, amod, amod, 90, 90, 90"
}
{ print }
' list_*.txt

首先,您有"list_0.88.txt,list_0.90.txt…",依此类推,对吗?如你所愿,我认为我们可以这样修改外壳:

#!/bin/bash
for i in "0.88 0.90 0.92 0.94 0.96 0.98 1.00 1.02 1.04 1.06 1.08 1.10 1.12"
do
        a_original_A=5
        amod=`bc <<< "$i*$a_original_A"`
        echo "---->$amod"
        echo "12" > /tmp/tmpfile
        echo "list_number_$i  $amod  $amod  $amod  90  90  90" >> /tmp/tmpfile
        cat list_${i} >> /tmp/tmpfile
        cp -rf list_${i}.txt list_${i}.txt.bak
        cp -rf /tmp/tmpfile list_${i}.txt
done

有很多可能的方法。此代码使用seq命令生成数字范围。它分为三部分。第一部分创建"预先存在"的文件。

第二部分展示了编辑文件的两种方法。带有行(标记)12A的版本不需要sed-i的支持(它不是标准的,GNU sed的行为与BSD(Mac OS X)sed的行为不同)。带有行(标记)12B的版本使用经典的sed表示法(与GNU sed和其他变体一起使用)在文件中原始文本的第1行之前插入两行信息。

# Generate 'pre-existing' files
for number in $(seq -f '%4.2f' 0.88 0.02 1.12)
do echo "Pre-existing data in file $number" > list_$number.txt
done
tmp=$(mktemp ./tmp.XXXXXX)
trap "rm -f $tmp; exit 1" 0 1 2 3 13 15
for number in $(seq -f '%4.2f' 0.88 0.02 1.12)
do
    list="list_$number.txt"
    # Works without using sed
    {
    echo "12A"
    echo "$number" | awk '{ x=5*$1; printf("list_number_%4.2f %4.1f %4.1f %4.1f 90 90 90n", $1, x, x, x) }'
    cat "$list"
    } > "$tmp"
    cp "$tmp" "$list"
    rm -f "$tmp"
    # Option 2 (as written, works with GNU sed and BSD sed)
    amod=$(echo "$number" | awk '{printf "%4.1fn", 5*$1}')
    sed -i.bak -e "1i\
    12B\
    list_number_$number $amod $amod $amod 90 90 90" "$list"
done
trap 0 1 2 3 13 15

样本输出(cat list_1.1?.txt):

12B
list_number_1.10  5.5  5.5  5.5 90 90 90
12A
list_number_1.10  5.5  5.5  5.5 90 90 90
Pre-existing data in file 1.10
12B
list_number_1.12  5.6  5.6  5.6 90 90 90
12A
list_number_1.12  5.6  5.6  5.6 90 90 90
Pre-existing data in file 1.12

显然,该代码假设您有seq,但它可以作为GNU CoreUtils的一部分在Mac OS X上使用。

另一种技术:

# Generate pre-existing files as before
for number in $(seq -f '%4.2f' 0.88 0.02 1.12)
do echo "Pre-existing data in file $number" > list_$number.txt
done
# Generate the two parameters from awk; use sed to edit each file in turn.
awk 'BEGIN { for (i = 0.88; i <= 1.12; i += 0.02) printf "%4.2f %4.1fn", i, 5*i }' |
while read number amod
do
    list="list_$number.txt"
    sed -i.bak -e "1i\
    12\
    list_number_$number $amod $amod $amod 90 90 90" "$list"
done

样本输出(cat list_1.1?.txt):

12
list_number_1.10 5.5 5.5 5.5 90 90 90
Pre-existing data in file 1.10
12
list_number_1.12 5.6 5.6 5.6 90 90 90
Pre-existing data in file 1.12

最新更新