2012-11-02 5 views
3

Я относительно новичок в создании сценариев bash, начав с необходимости управлять своими симуляторами на суперкомпьютерах. В настоящее время я застрял в написании сценария для изменения определенных строк в моих файлах pbs.Замена определенных строк в нескольких файлах с помощью bash

Есть две стадии моей проблемы. Во-первых, мне нужно заменить несколько строк в текстовом файле (другой скрипт) и перезаписать этот файл для моего последующего использования. Грубая идея заключается в том:

Заменить строки 27, 28 и 29 'filename005' с 'text1=000', 'text2=005' и 'text3=010'

Далее, я хотел бы сделать это рекурсивно для набора текстовых файлов с нумерацией суффиксы, а нумерация влияет на замененный текст.

Мой код до сих пор:

#!/bin/bash 
for ((i = 1; i < 10; i++)) 
    do 
    let NUM=i*5 
    let OLD=NUM-5 
    let NOW=NUM 
    let NEW=NUM+5 

    let FILE=$(printf "filename%03g" $NUM) 
    sed "27 c\text1=$OLD" $FILE 
    sed "28 c\text2=$NOW" $FILE 
    sed "29 c\text3=$NEW" $FILE 
done 

Я знаю, что есть некоторые ошибки в последних 4 строк моего кода, и я до сих пор изучаю на правильном пути к реализации sed. Цените любые советы!

Спасибо! CS

+0

Более устойчивый подход может заключаться в том, чтобы ваши сценарии считывали свои параметры из файла конфигурации или набора переменных среды. – tripleee

ответ

1

Принимая первую строку спецификации:

Replace lines 27:29 of filename005, with text1=000; text2=005; text3=010 

Это становится:

sed -e '27,29c\ 
text1=000\ 
text2=005\ 
text3=010' filename005 

полоскание и повторить. Обратные косые черты указывают на sed, что изменение продолжается. Это проще для вас, если ваши фактические строки данных не должны заканчиваться обратными косыми чертами.

Вы можете играть с:

seq 1 35 | 
sed -e '27,29c\ 
text1=000\ 
text2=005\ 
text3=010' 

, чтобы увидеть, что происходит без риска повреждения драгоценных файлов. С учетом спецификационных строк вы можете написать сценарий sed для генерации сценариев sed из спецификации (хотя у меня возникнет соблазн использовать Perl или awk, а, скорее всего, я бы выполнил всю работу в Perl).

+0

Hi @Johnathan Leffler, спасибо за это, я проверю и проголосую, когда вернусь в свой офис в понедельник. – theFunnyEngineer

+0

Что вы подразумеваете под «заменой текста»? Вероятно, ответ «Да», но пока я не знаю, что вы хотите сделать, я не могу сказать вам, как это сделать. –

+0

Извинения за двусмысленный вопрос, я спросил, прежде чем думать. Сначала я попробую ваше предыдущее предложение, прежде чем уточнить свой вопрос. – theFunnyEngineer

0

Хорошо, мне удалось заставить мой код работать после того, как выяснили, что для прямой замены мне нужно записать его во временный файл. Таким образом, с рекурсией и заменой многострочных (и другими небольшими ухищрениями):

for ((i = 1; i < 10; i++)) 
    do 
    let NUM=i*5 
    let OLD=NUM-5 
    let NOW=NUM 
    let NEW=NUM+5 

    FILE=`printf "filename%03g" $NUM` 

    sed -e "27,29 c\ 
    OLD=$OLD\n\ 
    NOW=$NOW\n\ 
    NEW=$NEW" $FILE >temp.tmp && mv temp.tmp $FILE 
done 

Дайте мне знать, если есть более элегантный способ использовать sed в этом контексте. Еще раз спасибо @Johnathan!

Смежные вопросы