[英]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.