我有一个文件“列表”,如下所示:
main.c getname 25
main.c getage 36
util.c namecheck 123
上面有第一个字符串文件名、第二个函数名和第三个行号。我想要:
- 打开文件(第一列)
- 转至行号(第 3 列)
- 编辑字符串(第二列)。
例如:打开文件 main.c,将第 25 行的字符串 getname 更改为 getname()
有人知道如何使用 sed 和 awk 完成上述操作吗?
我尝试使用以下方法。但是没有用
awk '{ sed -e "$3s/$2/&()" <$1 >$1_new }' list
答案1
如果您不想更改原始文件,则必须遍历 中的文件名list
并将其复制掉,否则重定向>
将覆盖对新文件的任何先前更改(如果 中有多个针对同一文件的条目,就会发生这种情况list
)。 类似这样的操作将使您的原始文件保持不变:
#!/bin/bash
list=testlist.txt
# get the first column in $list, sort it, remove duplicates
# and copy file to *_new. ignore if it doesn't exist
awk '{ print $1 }' "${list}" | sort -u | while read file; do
[ -e "${file}" ] || continue
cp "${file}" "${file}_new"
done
# for each line in $list, get the filename, function name and line number
while read file func lineno; do
# change filename to the one we wish to apply the changes to
file="${file}_new"
# file should exist as we just created it,
# but if it doesn't, skip entry.
[ -e "${file}" ] || continue
# replace
sed -i "${lineno}s/${func}/${func}()/" "${file}"
done < "${list}"