我编写了一个带有“add”、“clear”和“find”参数的待办事项列表脚本。我需要传递“完成”参数和脚本查找相关行并将其第一列替换为另一个值。我怎样才能做到这一点?
脚本结果如下所示:
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
as尝试首先从当前工作目录gawk
加载inplace
扩展(asinplace
或),有人可能已经在其中植入了恶意软件。随系统提供的扩展inplace.awk
的路径可能会有所不同,请参阅输出inplace
gawk
gawk 'BEGIN{print ENVIRON["AWKPATH"]}'