Заменить первую строку в текстовом файле на i-ю строку из другого текстового файла

В разделах Snap используются SquashFS, которые в основном представляют собой сжатый формат данных только для чтения, который обычно используется для создания живых CD / DVD-дисков. SquashFS просто не предназначен для чтения и записи.

Ваши параметры:

Перестроить файловую систему SquashFS. Чтобы изменить содержимое, даже что-то такое же простое, как изменение прав доступа к файлам, невозможно. Следующие ресурсы должны быть полезны: Изменение squashfs Как изменить изображение squashfs Используйте OverlayFS для сохранения изменений отдельно.

Если вы хотите стать разработчиком Snap, вы можете начать с этого учебника до . Для разделов Snap используйте .

4
задан 3 November 2010 в 21:09

16 ответов

Чтобы заменить первую строку FILE.out на i-ю строку FILE.in, я бы сделал:

 i=<line-number>
 line=$(sed -n "${i}p" FILE.in)
 sed -i "1c\\$line" FILE.out

Если i не существует в FILE.in, то первая строка FILE.out будет удалена (пустая).

Если $line содержит какие-либо специальные символы (например, обратную косую черту, доллар), вам нужно будет их избежать. [!d2 ]

Не 100% уверены, что это не могло сломаться в другом месте.

3
ответ дан 26 May 2018 в 00:38
  • 1
    @ Htorque-х: & GT; Спасибо, он работает как шарм (см. Вопрос редактирования). Однако на торте есть небольшая уловка / обледенение (см. Вторую часть редактирования вопроса). Знаете ли вы об исправлении? – user2413 3 November 2010 в 15:55
  • 2
    Я действительно не понимаю, что вы пытаетесь сделать (вы заменяете одну и ту же строку снова и снова?). Это весь код? Что касается вашего последующего вопроса: вы хотите сохранить результат этой команды в nline, а не в команде. Итак, вы сделали бы nline=$(sed -n "$=" filein.txt). Просто имейте в виду, что это само по себе может сломать for-loop, если filein.txt был пустым файлом. – htorque 3 November 2010 в 16:12
  • 3
    фактически, в «реальном» коде filein.txt содержит список из 1000 параметров (по одному на строки). fileout.txt - это скрипт (который запускается в bash), вызывая исполняемый файл, который использует эти параметры. У меня нет источника этого последнего исполняемого файла, поэтому я продолжаю этот путь. (как вы думаете, я должен добавить эту информацию к вопросу, для будущих пользователей?). – user2413 3 November 2010 в 17:57
  • 4
    & Quot; Просто имейте в виду, что это само по себе может сломать for-loop, если filein.txt был пустым файлом & quot ;. На самом деле это именно то поведение, которое я ищу :) – user2413 3 November 2010 в 17:57

Чтобы заменить первую строку FILE.out на i-ю строку FILE.in, я бы сделал:

i=<line-number> line=$(sed -n "${i}p" FILE.in) sed -i "1c\\$line" FILE.out

Если i не существует в FILE.in, то первая строка FILE.out будет удалена (пустая).

Если $line содержит какие-либо специальные символы (например, обратную косую черту, доллар), вам нужно будет их избежать.

Не 100% уверены, что это не могло сломаться в другом месте.

3
ответ дан 25 July 2018 в 22:57

Чтобы заменить первую строку FILE.out на i-ю строку FILE.in, я бы сделал:

i=<line-number> line=$(sed -n "${i}p" FILE.in) sed -i "1c\\$line" FILE.out

Если i не существует в FILE.in, то первая строка FILE.out будет удалена (пустая).

Если $line содержит какие-либо специальные символы (например, обратную косую черту, доллар), вам нужно будет их избежать.

Не 100% уверены, что это не могло сломаться в другом месте.

3
ответ дан 27 July 2018 в 01:41

Чтобы заменить первую строку FILE.out на i-ю строку FILE.in, я бы сделал:

i=<line-number> line=$(sed -n "${i}p" FILE.in) sed -i "1c\\$line" FILE.out

Если i не существует в FILE.in, то первая строка FILE.out будет удалена (пустая).

Если $line содержит какие-либо специальные символы (например, обратную косую черту, доллар), вам нужно будет их избежать.

Не 100% уверены, что это не могло сломаться в другом месте.

3
ответ дан 2 August 2018 в 04:20

Чтобы заменить первую строку FILE.out на i-ю строку FILE.in, я бы сделал:

  i = & lt; номер строки & gt;  line = $ (sed -n "$ {i} p" FILE.in) sed -i "1c \\ $ line" FILE.out  

Если i не существует в FILE.in, тогда первая строка FILE.out будет удалена (пустая).

Если $ line содержит любые специальные символы (например, обратная косая черта , доллар), тогда вам нужно будет избежать этих.

Не 100% уверены, что это не может сломаться в другом месте.

3
ответ дан 6 August 2018 в 04:25

Чтобы заменить первую строку FILE.out на i-ю строку FILE.in, я бы сделал:

  i = & lt; номер строки & gt;  line = $ (sed -n "$ {i} p" FILE.in) sed -i "1c \\ $ line" FILE.out  

Если i не существует в FILE.in, тогда первая строка FILE.out будет удалена (пустая).

Если $ line содержит любые специальные символы (например, обратная косая черта , доллар), тогда вам нужно будет избежать этих.

Не 100% уверены, что это не может сломаться в другом месте.

3
ответ дан 7 August 2018 в 22:31

Чтобы заменить первую строку FILE.out на i-ю строку FILE.in, я бы сделал:

  i = & lt; номер строки & gt;  line = $ (sed -n "$ {i} p" FILE.in) sed -i "1c \\ $ line" FILE.out  

Если i не существует в FILE.in, тогда первая строка FILE.out будет удалена (пустая).

Если $ line содержит любые специальные символы (например, обратная косая черта , доллар), тогда вам нужно будет избежать этих.

Не 100% уверены, что это не может сломаться в другом месте.

3
ответ дан 10 August 2018 в 10:39

Чтобы заменить первую строку FILE.out на i-ю строку FILE.in, я бы сделал:

  i = & lt; номер строки & gt;  line = $ (sed -n "$ {i} p" FILE.in) sed -i "1c \\ $ line" FILE.out  

Если i не существует в FILE.in, тогда первая строка FILE.out будет удалена (пустая).

Если $ line содержит любые специальные символы (например, обратная косая черта , доллар), тогда вам нужно будет избежать этих.

Не 100% уверены, что это не может сломаться в другом месте.

3
ответ дан 13 August 2018 в 17:12
  • 1
    @ Htorque-х: & GT; Спасибо, он работает как шарм (см. Вопрос редактирования). Однако на торте есть небольшая уловка / обледенение (см. Вторую часть редактирования вопроса). Знаете ли вы об исправлении? – user2413 3 November 2010 в 15:55
  • 2
    Я действительно не понимаю, что вы пытаетесь сделать (вы заменяете одну и ту же строку снова и снова?). Это весь код? Что касается вашего последующего вопроса: вы хотите сохранить результат этой команды в nline , а не в команде. Таким образом, вы сделали бы nline = $ (sed -n & quot; $ = & quot; filein.txt) . Просто имейте в виду, что это само по себе может сломать for-loop, если filein.txt был пустым файлом. – htorque 3 November 2010 в 16:12
  • 3
    фактически, в «реальном» коде filein.txt содержит список из 1000 параметров (по одному на строки). fileout.txt - это скрипт (который запускается в bash), вызывая исполняемый файл, который использует эти параметры. У меня нет источника этого последнего исполняемого файла, поэтому я продолжаю этот путь. (как вы думаете, я должен добавить эту информацию к вопросу, для будущих пользователей?). – user2413 3 November 2010 в 17:57
  • 4
    & Quot; Просто имейте в виду, что это само по себе может сломать for-loop, если filein.txt был пустым файлом & quot ;. На самом деле это именно то поведение, которое я ищу :) – user2413 3 November 2010 в 17:57

В программу входят две части: получение нужного вам результата, а затем замена содержимого исходного файла на этот вывод:

#!/bin/sh
# output the first five lines of the first argument
# followed by all but the first of the second argument
# if successful, replace the second argument with the
# result

# cribbed almost entirely from Kernighan & Pike's
$ "The Unix Programming Environment" script "overwrite"

case $# in
0|1)        echo 'Usage: replace5 filea fileb' 1>&2; exit 2
esac

filea=$1; fileb=$2
new=/tmp/$$.new; old=/tmp/$$.old
trap 'rm -f $new; exit 1' 1 2 15    # clean up files

# collect input
if head -5 $filea >$new && tail -n +2 $fileb >> $new
then
    cp $filea $old   # save original file
    trap 'trap "" 1 2 15; cp $filea $old   # ignore signals
          rm -f $new $old; exit 1' 1 2 15   # during restore
    cp $new $filea
else
    echo "replace5: failed, $filea unchanged" 1>&2
    exit 1
fi
rm -f $new $old
1
ответ дан 26 May 2018 в 00:38

В программу входят две части: получение нужного вам результата, а затем замена содержимого исходного файла на этот вывод:

#!/bin/sh # output the first five lines of the first argument # followed by all but the first of the second argument # if successful, replace the second argument with the # result # cribbed almost entirely from Kernighan & Pike's $ "The Unix Programming Environment" script "overwrite" case $# in 0|1) echo 'Usage: replace5 filea fileb' 1>&2; exit 2 esac filea=$1; fileb=$2 new=/tmp/$$.new; old=/tmp/$$.old trap 'rm -f $new; exit 1' 1 2 15 # clean up files # collect input if head -5 $filea >$new && tail -n +2 $fileb >> $new then cp $filea $old # save original file trap 'trap "" 1 2 15; cp $filea $old # ignore signals rm -f $new $old; exit 1' 1 2 15 # during restore cp $new $filea else echo "replace5: failed, $filea unchanged" 1>&2 exit 1 fi rm -f $new $old
1
ответ дан 25 July 2018 в 22:57

В программу входят две части: получение нужного вам результата, а затем замена содержимого исходного файла на этот вывод:

#!/bin/sh # output the first five lines of the first argument # followed by all but the first of the second argument # if successful, replace the second argument with the # result # cribbed almost entirely from Kernighan & Pike's $ "The Unix Programming Environment" script "overwrite" case $# in 0|1) echo 'Usage: replace5 filea fileb' 1>&2; exit 2 esac filea=$1; fileb=$2 new=/tmp/$$.new; old=/tmp/$$.old trap 'rm -f $new; exit 1' 1 2 15 # clean up files # collect input if head -5 $filea >$new && tail -n +2 $fileb >> $new then cp $filea $old # save original file trap 'trap "" 1 2 15; cp $filea $old # ignore signals rm -f $new $old; exit 1' 1 2 15 # during restore cp $new $filea else echo "replace5: failed, $filea unchanged" 1>&2 exit 1 fi rm -f $new $old
1
ответ дан 27 July 2018 в 01:41

В программу входят две части: получение нужного вам результата, а затем замена содержимого исходного файла на этот вывод:

#!/bin/sh # output the first five lines of the first argument # followed by all but the first of the second argument # if successful, replace the second argument with the # result # cribbed almost entirely from Kernighan & Pike's $ "The Unix Programming Environment" script "overwrite" case $# in 0|1) echo 'Usage: replace5 filea fileb' 1>&2; exit 2 esac filea=$1; fileb=$2 new=/tmp/$$.new; old=/tmp/$$.old trap 'rm -f $new; exit 1' 1 2 15 # clean up files # collect input if head -5 $filea >$new && tail -n +2 $fileb >> $new then cp $filea $old # save original file trap 'trap "" 1 2 15; cp $filea $old # ignore signals rm -f $new $old; exit 1' 1 2 15 # during restore cp $new $filea else echo "replace5: failed, $filea unchanged" 1>&2 exit 1 fi rm -f $new $old
1
ответ дан 2 August 2018 в 04:20

В программу входят две части: получение нужного вам результата, а затем замена содержимого исходного файла на этот вывод:

  #! / bin / sh # выводят первые пять  строки первого аргумента #, за которым следуют все, кроме первого из второго аргумента #, если это необходимо, замените второй аргумент на # result #, который был почти полностью собран из Kernighan & amp;  Pike's $ «Среда программирования Unix» Сценарий «перезаписать» $ # в 0 | 1) echo 'Использование: replace5 filea fileb' 1 & amp; 2;  exit 2 esac filea = $ 1;  fileb = $ 2 new = / tmp / $$. new;  old = / tmp / $$. old trap 'rm -f $ new;  exit 1 '1 2 15 # clean up files # collect input, если head -5 $ filea & gt; $ new & amp; & amp; & amp; & amp; & amp;  tail -n +2 $ fileb & gt; & gt;  $ new, тогда cp $ filea $ old # save original trap trap trap "1 2 15;  cp $ filea $ old # игнорировать сигналы rm -f $ new $ old;  exit 1 '1 2 15 # во время восстановления cp $ new $ filea else echo "replace5: failed, $ filea unchanged" 1 & gt; & amp; 2 exit 1 fi rm -f $ new $ old  
1
ответ дан 6 August 2018 в 04:25

В программу входят две части: получение нужного вам результата, а затем замена содержимого исходного файла на этот вывод:

  #! / bin / sh # выводят первые пять  строки первого аргумента #, за которым следуют все, кроме первого из второго аргумента #, если это необходимо, замените второй аргумент на # result #, который был почти полностью собран из Kernighan & amp;  Pike's $ «Среда программирования Unix» Сценарий «перезаписать» $ # в 0 | 1) echo 'Использование: replace5 filea fileb' 1 & amp; 2;  exit 2 esac filea = $ 1;  fileb = $ 2 new = / tmp / $$. new;  old = / tmp / $$. old trap 'rm -f $ new;  exit 1 '1 2 15 # clean up files # collect input, если head -5 $ filea & gt; $ new & amp; & amp; & amp; & amp; & amp;  tail -n +2 $ fileb & gt; & gt;  $ new, тогда cp $ filea $ old # save original trap trap trap "1 2 15;  cp $ filea $ old # игнорировать сигналы rm -f $ new $ old;  exit 1 '1 2 15 # во время восстановления cp $ new $ filea else echo "replace5: failed, $ filea unchanged" 1 & gt; & amp; 2 exit 1 fi rm -f $ new $ old  
1
ответ дан 7 August 2018 в 22:31

В программу входят две части: получение нужного вам результата, а затем замена содержимого исходного файла на этот вывод:

  #! / bin / sh # выводят первые пять  строки первого аргумента #, за которым следуют все, кроме первого из второго аргумента #, если это необходимо, замените второй аргумент на # result #, который был почти полностью собран из Kernighan & amp;  Pike's $ «Среда программирования Unix» Сценарий «перезаписать» $ # в 0 | 1) echo 'Использование: replace5 filea fileb' 1 & amp; 2;  exit 2 esac filea = $ 1;  fileb = $ 2 new = / tmp / $$. new;  old = / tmp / $$. old trap 'rm -f $ new;  exit 1 '1 2 15 # clean up files # collect input, если head -5 $ filea & gt; $ new & amp; & amp; & amp; & amp; & amp;  tail -n +2 $ fileb & gt; & gt;  $ new, тогда cp $ filea $ old # save original trap trap trap "1 2 15;  cp $ filea $ old # игнорировать сигналы rm -f $ new $ old;  exit 1 '1 2 15 # во время восстановления cp $ new $ filea else echo "replace5: failed, $ filea unchanged" 1 & gt; & amp; 2 exit 1 fi rm -f $ new $ old  
1
ответ дан 10 August 2018 в 10:39

В программу входят две части: получение нужного вам результата, а затем замена содержимого исходного файла на этот вывод:

  #! / bin / sh # выводят первые пять  строки первого аргумента #, за которым следуют все, кроме первого из второго аргумента #, если это необходимо, замените второй аргумент на # result #, который был почти полностью собран из Kernighan & amp;  Pike's $ «Среда программирования Unix» Сценарий «перезаписать» $ # в 0 | 1) echo 'Использование: replace5 filea fileb' 1 & amp; 2;  exit 2 esac filea = $ 1;  fileb = $ 2 new = / tmp / $$. new;  old = / tmp / $$. old trap 'rm -f $ new;  exit 1 '1 2 15 # clean up files # collect input, если head -5 $ filea & gt; $ new & amp; & amp; & amp; & amp; & amp;  tail -n +2 $ fileb & gt; & gt;  $ new, тогда cp $ filea $ old # save original trap trap trap "1 2 15;  cp $ filea $ old # игнорировать сигналы rm -f $ new $ old;  exit 1 '1 2 15 # во время восстановления cp $ new $ filea else echo "replace5: failed, $ filea unchanged" 1 & gt; & amp; 2 exit 1 fi rm -f $ new $ old  
1
ответ дан 13 August 2018 в 17:12

Другие вопросы по тегам:

Похожие вопросы: