私は「追加」、「消去」、および「検索」パラメータを使用してToDoリストスクリプトを作成しました。 "complete"パラメータを渡す必要があり、スクリプトは関連する行を見つけて最初の列を別の値に置き換えます。どうすればいいですか?
スクリプトの結果は次のとおりです。
0,H,First Task
0,L,Second Task
0,M,Third Task
さて、同様のことを行い、./todo done 2
次の結果を得たいと思います。
0,H,First Task
1,L,Second Task
0,M,Third Task
答え1
#!/bin/bash
fis=$1
col1=$2
if [[ $fis == "done" ]]
then
awk -v col1="$col1" -F "," 'BEGIN{OFS=","}NR==col1{gsub(".*","PRAVEEN",$1)}1' ht.txt
fi
出力
0,H,First Task
PRAVEEN,L,Second Task
0,M,Third Task
答え2
file=todo.list
line=2
perl -F, -pi -lapse '
$F[0] = 1 if $. == $line;
$_ = join ",", @F' -- -line="$line" -- "$file"
または以下を使用してgawk
:
file=todo.list
line=2
gawk -i /usr/share/awk/inplace.awk -v line="$line" -F, -v OFS=, -e '
NR == line {$1 = 1}
{print}' -E /dev/null "$file"
GNUを使用すると、sed
次のことができます。
sed -i -e "${line}s/^[^,]*/1/" -- "$file"
しかし、事前に整理する必要があります$line
(文字シーケンスが含まれていることを確認[0123456789]
)。そうしないと、次の問題が発生する可能性があります。任意コマンドの実行脆弱性。
そしてgawk
、使用しないでください-i inplace
現在の作業ディレクトリから最初に拡張機能をgawk
ロードしようとすると、誰かがそのディレクトリにマルウェアを植えた可能性があります。システムに付属の拡張プログラムのパスは異なる場合があります。出力を参照してください。inplace
inplace
inplace.awk
inplace
gawk
gawk 'BEGIN{print ENVIRON["AWKPATH"]}'