特殊行を探して特殊文字列を置き換える方法

特殊行を探して特殊文字列を置き換える方法

私は「追加」、「消去」、および「検索」パラメータを使用して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ロードしようとすると、誰かがそのディレクトリにマルウェアを植えた可能性があります。システムに付属の拡張プログラムのパスは異なる場合があります。出力を参照してください。inplaceinplaceinplace.awkinplacegawkgawk 'BEGIN{print ENVIRON["AWKPATH"]}'

関連情報