我有一个文件名和行号的列表。如何就地修改这些行?

我有一个文件名和行号的列表。如何就地修改这些行?

我有以下格式的文件名和行号列表:

./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

更好地使用sedawk查找匹配的文件+行向它们附加文本。

相关内容