需要 SED 和 AWK 方面的帮助

需要 SED 和 AWK 方面的帮助

我有一个文件“列表”,如下所示:

main.c getname 25
main.c getage  36
util.c namecheck 123

上面有第一个字符串文件名、第二个函数名和第三个行号。我想要:

  1. 打开文件(第一列)
  2. 转至行号(第 3 列)
  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}"

相关内容