Если я понимаю правильно, возможно, что-то как:
awk '{getline repl < "second-file"; sub(/regexp/, repl); print}' < first-file
Или если regexp
может появиться несколько раз на строку или не на каждой строке:
perl -pe 's/regexp/chomp($r=<STDIN>);$r/ge' first-file < second-file
Чтобы получить тот же вывод, который вы заметили в вашем вопросе, все, что вам нужно, это:
Вам не нужно искажать. Эти две строки сделают все это в любом shell'е, который притворяется чем-то близким к совместимости с POSIX.
Примечание: недавно узнав о [118408]yash[118409], я построил его вчера. По какой-то причине он не печатает первый байт каждого аргумента строкой [118410]%c[118411] - хотя документы были специфичны насчёт расширений для этого формата, и поэтому, возможно, это связано - но он прекрасно работает с [118412]%.1s
Вот и всё. Там есть две основные вещи. И вот как это выглядит:PARSING [117967]$PWD
+---------------------------+ +--------------------------+
|Answer question | | ???? |
|---------------------------| |--------------------------|
| eat pizza | | ???? |
| |+---------->| |
| | | |
| | | |
| | | |
| | | |
| | | |
+---------------------------+ +---------+----------------+
|
+-------------------------+ |
| PROFIT! | |
|-------------------------| |
| | |
| |-----------------+
| |
| |
| |
| |
+-------------------------+
Каждый раз, когда [118414]$PS1[118415] оценивается, он разбирает и печатает [118416]$PWD[118417] для добавления в подсказку. Но мне не нравится, что весь [118418]$PWD[118419] переполняет мой экран, поэтому мне нужна только первая буква каждой хлебной крошки в текущем пути вниз к текущему каталогу, который я хотел бы видеть в полном объеме. Например:
Здесь есть несколько шагов:
mysqldump -u user -p databasename > dump.sql
IFS=/
scp dump.sql user@remotehost.ip:
нам придется разделить текущий [118493]$PWD[118494] и самый надежный способ сделать это - разделить [118495]$IFS[118496] на [118497]/[118498]. После этого вообще не стоит беспокоиться - все разделения отсюда будут определяться позиционным параметром оболочки [118499]$@[118500] в следующей команде аналогично:
mysql -u user -p databasename < dump.sql
set -- ${PWD%"${last=${PWD##/*/}}"}
printf "${1+%c/}". "$@"Так что здесь - пока [118529]${1+is set}[118530] мы [118531]printf[118532] распечатываем первый [118533]%c[118534]haracter каждого аргумента нашей оболочки - который мы только что установили для каждого каталога в нашем текущем [118535]$PWD[118536] - за вычетом верхнего каталога - разбиваем на [118537]/[118538]. Таким образом, мы, по сути, просто распечатываем первый символ каждой директории в [118539]$PWD[118540], но верхней. Важно, однако, понимать, что это происходит только в том случае, если [118541]$1[118542] вообще будет установлен, что не произойдет в корне [118543]/[118544] или в одном из каталогов, удалённом из [118545]/[118546], например, в [118547]/etc[118548].
printintf "$last > "
$last[118552]] - это переменная, которую я только что присвоил нашей верхней директории. Так что теперь это наш верхний каталог. Она печатает, независимо от того, было ли это последнее утверждение или нет. И для хорошей меры нужно немного [118553]>[118554].
="INSERT INTO MyTable (ISAM_ID, ENTITY, CUSTOMER_MEDIA,STATUS,IIN,OID,FVC)"
& " VALUES (" & A2 & ", '" & B2 & "', '" & C2
& "', '" & D2 & "','" & E2 & "', '" & F2 & "', '" & G2 & "', '" & H2 & "');"
Но что с этой переменной?
INSERT INTO MyTable (ISAM_ID, ENTITY, CUSTOMER_MEDIA,STATUS,IIN,OID,FVC)
VALUES ( 10001, 'ErferrRR01','MP3','LOADED'
,'RRGEE', '232133122dfcsdds212121','TGEE');
И еще условие [118436]$PS2[118437]. Ранее я показывал, как это можно сделать, что вы еще можете найти ниже - это, по сути, вопрос сферы применения. Но есть еще кое-что, если только вы не хотите начать делать кучу [118438]printf \b[118439]ackspaces, а затем пытаться сбалансировать их количество символов... ух. Итак, я делаю так:
PS1='$(ps1)${PS2c###*[$((PS2c=0))-9]}'Опять же, [118557]${параметр##расширение}[118558] спасает день. Однако здесь немного странно - мы на самом деле устанавливаем переменную, в то время как лишаем ее самой себя. Мы используем ее новое значение - устанавливаем середину полосы - в качестве глобуса, с которого мы ее снимаем. Видите? Мы [118559]##*[118560]вырезаем все из головы нашей переменной инкремента до последнего символа, которым может быть что угодно из [118561][$((PS2c=0))-9][118562]. Таким образом, мы гарантированно не выведем значение, но все равно присвоим его. Это довольно круто - я никогда не делал этого раньше. Но POSIX также гарантирует нам, что это самый портативный способ.
И именно благодаря POSIX-специфическому [117979]${параметру} $((расширению))[117980], мы сохраняем эти определения в текущей оболочке, не требуя, чтобы мы устанавливали их в отдельную подоболочку, независимо от того, где мы их оцениваем. И поэтому он работает в [117981]dash[117982] и [117983]sh[117984] так же хорошо, как и в [117985]bash[117986] и [117987]zsh[117988]. Мы не используем оболочек/терминальных зависимых экранировок и позволяем переменным тестировать себя. Это и делает переносной код [117989] быстрым.
Остальное довольно просто - просто увеличиваем наш счетчик для каждого раза, когда вычисляется [117991]$PS2[117992], пока [117993]$PS1[117994] не сбросит его еще раз. Like this:
PS2='$((PS2c=PS2c+1)) > Так что теперь я могу:
DASH DEMO
SH DEMO
Она работает так же в [117997]bash[117998] или [117999]sh[118000]:
Как я уже говорил выше, основная проблема заключается в том, что вам нужно подумать, где вы выполняете свои вычисления. Вы не получаете состояние в родительской оболочке - значит, вы не вычисляете там. Вы получаете состояние в подоболочке - значит, именно там вычисляете. Но вы делаете определение в родительской оболочке.
Если вас беспокоит необходимость в отдельном файле за сессию оболочки (что кажется незначительным беспокойством; будете ли вы на самом деле печатать многострочные команды в двух разных оболочках одновременно? ), вы должны использовать [118098]mktemp[118099] для создания нового файла для каждого использования.
Значение переменной
PROMPT_COMMAND
преобразуется в команду, которая выполняется перед выводом на печать строки [119074]PS1[119075].
Для [119076]PS2[119077] нет ничего сравнимого. Но вместо этого можно использовать трюк: так как все, что вы хотите сделать - это арифметическая операция, можно использовать арифметическое расширение, которое не включает в себя подоболочку. Результат арифметического вычисления попадает в подсказку. Если вы хотите скрыть его, то можете передать его как подскрипт массива, которого не существует.