У меня есть файл «list» следующим образом:
main.c getname 25
main.c getage 36
util.c namecheck 123
Выше есть имя файла первой строки, имя второй функции и номер третьей строки. Я хочу:
Пример: откройте файл main.c, измените строку getname на getname () в строке № 25
Кто-нибудь знает, как это сделать, используя sed и awk?
Я пытался использовать следующее. Но это не работает
awk '{ sed -e "$3s/$2/&()" <$1 >$1_new }' list
Если Вы не хотите изменять исходные файлы, необходимо выполнить итерации по именам файлов в 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}"