Слияние файлов в Bash - PullRequest
       15

Слияние файлов в Bash

2 голосов
/ 01 марта 2012

У меня есть файл сценария, который использует команды импорта и загрузки для ввода сценариев из других файлов. Я пытаюсь преобразовать эти сценарии в новый язык, но трудно следить за переменными во всех различных операциях импорта / загрузки. Я пытаюсь написать 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

Ответы [ 3 ]

3 голосов
/ 01 марта 2012

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

awk '{if ($1 ~ /^(LOAD|IMPORT)/) {gsub(/\\/, "/", $2); system("cat " $2)} else print}' test.txt > output.txt
2 голосов
/ 01 марта 2012
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 "here-string"
    grep 'IMPORT\|LINE' <<< "$line"
  • отсутствует ключевое слово fi для if оператора
  • всегда заключайте в кавычки переменные, если только вы не хотите, чтобы побочные эффекты оставлялись в кавычках
0 голосов
/ 01 марта 2012

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

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

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

...