我有以下格式的文件名和行号列表:
./foo.txt:1:(more characters)
./foo.txt:3:(more characters)
./bar.txt:10:(more characters)
该列表可以来自文件,也可以由进程输出(例如,grep -n
)。
我想将一些固定文本附加到每个引用的行,并就地修改文件。
例如,如果文件 foo.txt 包含以下文本:
One
Two
Three
Four
我希望将其修改为包含:
One TODO
Two
Three TODO
Four
同样,“TODO”应附加到 bar.txt 的第 10 行。
我怎样才能做到这一点?
答案1
一种选择:使用 ed!
while IFS=: read -r filename linenumber junk
do
ed -s "$filename" <<< "$linenumber"$'s/$/ TODO/\nw\nq'
done < input
答案2
假设您的文件名既不包含:
也不包含换行符:
echo "$list_of_file_names" | while IFS=: read -r file line text; do
sed -i "$line"'s/$/ TODO/' "$file"
done
笔记: 我认为这是一个非常糟糕的主意
- 它效率低下(
sed
每行运行)。- 它将在包含
:
或 的文件名上中断\n
。更好地使用
sed
或awk
查找匹配的文件+行和向它们附加文本。