簡體   English   中英

在shell腳本中轉​​義sed

[英]escape sed in shell script

我希望使用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 '1i\12' 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個非空的文本文件; 我希望將這些新行添加為每個現有文件中的前兩行。

首先,您有“ list_0.88.txt,list_0.90.txt ...”,依此類推,對吧? 如您所願,我認為我們可以像這樣修改shell:

#!/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

您到底要做什么使用shell plus sed plus 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

有很多可能的方法可以做到這一點。 此代碼使用seq命令生成數字范圍。 它分為3部分。 第一部分創建“現有”文件。

第二部分顯示了兩種編輯文件的方法。 帶有(標記)行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 90\n", $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.1f\n", 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.1f\n", 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM