2012-03-01 3 views
2

У меня есть файл сценария, который использует команды импорта и загрузки для приведения сценариев из других файлов. Я пытаюсь преобразовать эти сценарии на новый язык, но трудно перечислить переменные через все разные импорты/нагрузки. Я пытаюсь написать BASH-скрипт, чтобы просмотреть файл и импортировать весь текст из встроенных/импортированных файлов внутри, где он был вызван.Слияние файлов в Bash

Окончательное решение используется!

sed -e 's/\\/\//g' test.restomatic | awk '{if ($1 ~ /^(LOAD|IMPORT)/) system("cat " $2); else print;}' > /cygdrive/c/bashScripts/testing.txt 

Образец Оригинальное Файл:

LOAD ..\..\..\..\GlobalSuccess\IdentityShardCreate_Success.rcq 
REPLACE /rest-client/request/url/*shard* "//{$OKEnv}" 
EXPECT HEADER SERVER 
EXPECT HEADER DATE 
EXPECT RETURN-CODE 201 
RUN 
IMPORT ..\..\..\..\GlobalSuccess\IdentityEnvironmentCreateNewEnvironmentFromShard_Success.rcq 
REPLACE /rest-client/request/url/*shard* "//{$OKEnv}/environment" 
EXPECT HEADER Server 
EXPECT HEADER Date 
EXPECT RETURN-CODE 204 
RUN 
ASSIGN ShardTypeControl 1 
LOOP ShardTypeControl 
ASSIGN OKShard2 {$ShardNames[{$ShardTypeControl}]} 
LOAD ..\..\..\..\GlobalSuccess\IdentityEnvironmentAddShardToEnvironment_Success.rcq 
REPLACE /rest-client/request/url/*shard* "//{$OKShard2}/environment/{$OKEnv}" 

Пример желаемых результатов выходного файла:

Original File (OF) Start 
(OF) Line 1 
(OF) Line 2 
(OF) Line 3 
Line 1 of Imported File - would have been (OF) line 4 
Line 2 of Imported File 
(OF) Line 5 
(OF) Line 6 
Line 1 of Loaded File - would have been (OF) line 7 
Line 2 of Loaded File 
Line 3 of Loaded File 
(OF) Line 8 
Line 1 of Second Imported File - would have been (OF) line 9 
Line 2 of Second Imported File 
+1

, пожалуйста, рассмотрите возможность редактирования сообщения, чтобы включить образец вашего входного файла, достаточно, чтобы мы могли понять вывод ввода-вывода. (меньше строк в порядке). Кроме того, вывод, который вы строите, выглядит как кошмар для любой последующей автоматизированной пост-обработки. Однако, если это читаемый человеком отчет, то это, вероятно, хорошо. Удачи. – shellter

+2

Что за утка ?! –

+0

Пожалуйста, имейте в виду, что результат выборки полностью «псевдокод», а реальный вывод должен быть буквально либо строками из базового файла, либо из файлов, с которых он тянул, спасибо – jheep

ответ

3

Все это можно объединить в одну команду AWK следующим образом:

awk '{if ($1 ~ /^(LOAD|IMPORT)/) {gsub(/\\/, "/", $2); system("cat " $2)} else print}' test.txt > output.txt 
+0

Хороший хак, но я не думаю, что это обязательно будет чередовать вещи должным образом для него. – Perry

+0

Я новичок в этом, и я понятия не имею, что это делает. awk превращает все в файл в ссылки? Я ценю помощь. Однако я даже не могу попытаться устранить что-то подобное, когда оно не запускается. – jheep

+0

@Перри: Почему бы и нет? Функция 'system()' полностью синхронна (поскольку она возвращает статус выхода команды), и она переносит отложенные выходные данные из всех буферов. Что мне не хватает? – ruakh

0

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

Сценарий bash, который вы написали, завершит объединение всех файлов, упомянутых в test.txt, в выходной файл в том порядке, в котором они были упомянуты, - это не приведет к смешиванию исходного и импортированного текста, который вы после.

Я предлагаю совершенно другой подход. Используйте sed для преобразования операторов IMPORT либо в операторы cpp #include, либо из эквивалента из m4, а затем запустите полученный файл через cpp или (с уважением) через m4. Это немного взломать, но он даст точно результат, который вы ищете.

+0

Спасибо, что ответили.Оригинальный язык скриптов - это, в основном, BASH, я верю, я новичок здесь и перехожу к тестовым примерам на PHP. В конечном счете, он должен быть читаемым для потребления человеком, поэтому мы можем убедиться, что логика не повреждена. Я не знаком с cpp #include или m4, о котором вы говорите. Первоначальные поиски не были ясны по тому, что они могут быть. – jheep

+0

IMPORT не является командой в Bash, поэтому я не знаю, как это выглядит в ваших сценариях Bash. «cpp» является препроцессором C. Вы найдете для него справочную страницу. «m4» - это обобщенный макропроцессор, для него также есть справочная страница. Любой может быть использован для импорта одного файла в другой. – Perry

2
while IFS= read -r line; do 
    case "$line" in 
    LOAD *|IMPORT *) cat "${line#* }" ;; 
    *) echo "$line" ;; 
    esac 
done < original.file 

Некоторые комментарию по коду в вопросе:

cat /path/original.file | while read $line; do 
if[grep 'IMPORT\|LOAD' $line]; then    
working on it 
else 
working on it: output to file /path/testing.txt 
done 
  • Должно быть while read line (без $)
  • [ представляет собой команду и требует пробелы до и после: if [ grep '...' ... ]; then
  • , чтобы Grep прочитать содержимое переменной, используйте BASh в «здесь-строка» Перенаправление
    grep 'IMPORT\|LINE' <<< "$line"
  • недостающую завершающего ключевое слово fi для if заявления
  • всегда указывайте ссылки на переменные, если только вы не хотите, чтобы побочные эффекты оставляли котировки.
+0

Это на самом деле ничего не делает, чем он сделал изначально. Он не работает, потому что он не будет чередовать исходный исходный файл с импортированным кодом. Все, что вы сделали, это заменить использование backquotes с помощью xargs. – Perry

+0

@Perry, правда. Я полностью упустил момент. Обновлено. –

+0

Ваша исправленная версия не плохая. – Perry

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