Как использовать вывод команды в качестве входной строки в команде «sed -i '10istring' a.txt» - PullRequest
0 голосов
/ 07 января 2020

У меня есть 2 файла.

a.txt

привет

привет

пока

b.txt

яблоко

банан

виноград

Каждый день мне приходится заменять строку 2 из a.txt на строку 3 из b.txt Итак, результат должен быть

a.txt

привет

виноград

пока

Содержимое обоих файлов каждый день меняется с помощью другой логики. Поэтому я не могу просто найти шаблон, но строка #, которую я должен заменить, никогда не меняется

Пока что у меня есть некоторые " Команда sed "как показано ниже

$> sed -i '2d' a.txt

$> sed -i '2i**grape**' a.txt

Эта команда даст мне желаемый результат, но в части" grape"я хочу использовать вывод команды как этот

$> sed -n 3p b.txt

Итак, псевдо-команда должна выглядеть так:

$> sed -i '2i**sed -n 3p b.txt**' a.txt

Подход, который я думаю, возможен? или у меня неправильный подход? Есть ли какое-то решение для этого?

Ответы [ 3 ]

1 голос
/ 08 января 2020

Класс присвоения? Если так ... убедитесь, что вы все понимаете! Это сделает то, что вы просили в чистой летучей мыши. Все дополнительные строки, кроме пустых, также будут скопированы. Это не будет работать, если есть! или другие специальные символы в файлах a и b.

@echo off
if exist Newb.txt del Newb.txt /F /Q
setlocal enabledelayedexpansion
set /a LineA=0
set /a LineB=0

for /F "delims=" %%B in (b.txt) do (
   set /a LineB+=1
   if !LineB! equ 3 (
      for /f "delims=" %%A in (a.txt) do (
         set /A LineA+=1
         if !LineA! equ 2 (echo(%%B>>Newb.txt) else (echo(%%A>>Newb.txt)
      )
   goto :Done
   )
)

:Done
endlocal
0 голосов
/ 08 января 2020

С sed попробуйте следующее:

sed -i "2c $(sed -n 3p b.txt)" a.txt

Результат:

hi
grape
bye
  • Внутренняя команда sed -n 3p b.txt извлекает 3-ю строку b.txt.
  • Подстановка команды $(command) заменяется выводом команды.
  • Затем строка 3 из b.txt используется в качестве текста замены для команды c.
0 голосов
/ 07 января 2020

В PowerShell вы можете сделать следующее:

$a = Get-Content a.txt
$b = Get-Content b.txt
$a[1] = $b[2]
$a | Set-Content a.txt

Менее читаемая однострочная строка будет выглядеть примерно так:

$a = gc a.txt; $a[0],(gc b.txt)[2],($a | select -skip 2) | sc a.txt

Команды PowerShell можно вызывать в пакетный файл также. Установите содержимое вашего командного файла, как показано ниже, а затем просто запустите командный файл в cmd:

PowerShell.exe -Command "$a = Get-Content a.txt;$b = Get-Content b.txt;$a[1] = $b[2];$a | Set-Content a.txt"
...