Изменить путь с помощью awk или sed - PullRequest
0 голосов
/ 19 сентября 2018

Здравствуйте, я хочу изменить путь символической ссылки на реальный путь в текстовом файле.Сначала я нахожу слово «SF:» и меняю путь.Сейчас я использую этот скрипт, но он медленный и не эффективный.Я думаю, что это может быть изменено командой awk или sed.Заранее спасибо.

#!/bin/bash
FILENAME="new1.info"
    echo "" > $FILENAME
while read LINE
do
if [ "" != "$(echo $LINE | grep -e "^SF:")" ]
then
    echo "SF:""$(realpath $(echo $LINE | cut -d":" -f2))" >> $FILENAME
else
    echo $LINE >> $FILENAME
fi
done < total.info

У меня большой текстовый файл, поэтому я хочу найти «SF:» и изменить строку примерно так:

SF:/home/ects/svn/moduleTests/ctest/tests/moduletests/base/tmp/src/base64.cpp

На это:

SF:/home/ects/svn/moduleTests/ctest/src/base/base64.cpp

1 Ответ

0 голосов
/ 19 сентября 2018

В bash я бы написал

#!/bin/bash
while IFS= read -r line; do
    if [[ "$line" == "SF:"* ]]; then
        line="SF:$(realpath "${line#SF:}")"
    fi
    echo "$line"
done < total.info > new1.info

На заметку:

  • в кавычках ваши переменные , каждый раз.
  • не используйте ALLCAPS varnames, это в конечном итоге укусит вас
  • обратите внимание, что перенаправление вывода было перемещено за пределы цикла while, так же, как перенаправление ввода
  • IFS= read -r line - это способ точного чтения строк из файла.

Я не знаю, будет ли это быстрее: bash может быть довольно медленным, особенно для циклов while read на большихфайлы.Вы можете попробовать другой язык:

perl -MCwd=abs_path -pe 's/^SF:\K(.*)/ abs_path($1) /e' total.info > new1.info
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...