Нужна помощь в САС и АВК

У меня есть файл «list» следующим образом:

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

Выше есть имя файла первой строки, имя второй функции и номер третьей строки. Я хочу:

  1. Открыть файл (1-й столбец)
  2. Перейти к строке № (3-й столбец)
  3. Редактировать строку (2-й столбец).

Пример: откройте файл main.c, измените строку getname на getname () в строке № 25

Кто-нибудь знает, как это сделать, используя sed и awk?

Я пытался использовать следующее. Но это не работает

awk '{ sed -e "$3s/$2/&()" <$1 >$1_new }' list
2
задан 1 April 2013 в 23:02

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}"
1
ответ дан 1 April 2013 в 23:02

Другие вопросы по тегам:

Похожие вопросы: