如何找到特殊行并替换特殊字符串

如何找到特殊行并替换特殊字符串

我编写了一个带有“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 inplaceas尝试首先从当前工作目录gawk加载inplace扩展(asinplace或),有人可能已经在其中植入了恶意软件。随系统提供的扩展inplace.awk的路径可能会有所不同,请参阅输出inplacegawkgawk 'BEGIN{print ENVIRON["AWKPATH"]}'

相关内容