Вставить текст на N строк перед последней строкой

Теперь это работает, не совсем правильно, но нормально.

После настройки меню, мне удалось добраться до кнопки, где я мог включить бинарный протестированный драйвер nVidia. Компьютер упал, и после перезагрузки два экрана оказались на расширенном рабочем столе, но перевернутыми (пришлось идти влево, чтобы зацепить правый экран).

Я попытался зайти в "Дисплеи", который теперь работает, но не кнопка "применить" (ошибка говорит, что я не могу применить изменения).

Но затем я использовал эти команды (они не работали ранее, говоря о внутренней ошибке) :

xrandr --output DVI-I-0 --off
xrandr --output DVI-I-0 --auto --right-of HDMI-0

И теперь, ярлык терминала работает и мониторы находятся в расширенном режиме рабочего стола, все, что я просил. Я просто надеюсь, что ошибка в меню предпочтений не вызовет дальнейших проблем.

7
15.05.2018, 11:52
7 ответов

Se puede hacer por simple headytail:

$ output=$(head -n -2 file ; echo 'new line' ; tail -2 file)
$ echo "$output" > file

Como se menciona en los comentarios, comerá cualquier línea en blanco final. Entonces, para preservar las líneas en blanco finales,

$ head -n -2 file >> file.tmp
$ echo 'new line' >> file.tmp
$ tail -2 file >> file.tmp
$ mv file.tmp file

o de una sola línea

$ head -n -2 file >> file.tmp ; echo 'new line' >> file.tmp; tail -2 file >> file.tmp ; mv file.tmp file
5
27.01.2020, 20:13

También podrías usar GNU sed:

sed -zE 's/(\n[^\n]*){3}$/\nNew-line&/' infile

Insertar una línea New-lineen la penúltima línea del archivo (Insertar una línea dos líneas antes de la última línea ).

Esto (\n[^\n]*){3}$coincide con \newline seguido de cualquier cosa menos un \newline y un máximo de 3 veces desde el final del archivo donde -zopción casing sed para leer un archivo como un línea única (líneas separadas por caracteres NUL ). Entonces coincidirá a continuación solo (entre los asteriscos que resalté):

3*\n
4\n
5\n*

Portabilidad, usarías:

sed -e ':t;N;$!bt; s/\(\n[^\n]*\)\{2\}$/\nNew-line&/' infile

si aún su sedno puede manejar una nueva línea \nen la pieza de reemplazo, puede tener una nueva línea real o presionar Ctrl + V seguido de Ingrese que imprimirá ^Mcaracteres de control de la tecla enter:

sed -e ':t;N;$!bt; s/\(\n[^\n]*\)\{2\}$/\
New-line&/' infile

Cómo funciona

El Nagrega cada línea sed leída al espacio del patrón seguido de una nueva línea agregada hasta que se lean todas las líneas. El :tdefine una etiqueta y $!btle dice a sed que salte a la etiqueta llamada tsiempre que no sea el final del archivo.

4
27.01.2020, 20:13
sed -e '
   1N
   $!{N;P;D;}
   H;g;s/^/NEW_LINE/
' input-data.txt

Cómo funciona

  • En todo momento mantenga dos líneas en el espacio patrón.
  • Imprima la primera de las dos líneas en el espacio del patrón, córtela y lea y agregue la siguiente.
  • Enjuagar... Hacer espuma... Repetir siempre que no se haya leído la última línea en el espacio del patrón.
  • En ese momento, insertamos una nueva línea (\n )al principio y luego colocamos la cadena requerida allí.
  • Esto es POSIX -lysed
0
27.01.2020, 20:13

Seguir awktambién podría ayudar.

awk -v line=$(wc -l < Input_file) -v val="new_line" 'FNR==(line-1){print val} 1' Input_file
1
27.01.2020, 20:13

Este debería ser bastante robusto contra el contenido de la línea insertada, pero requiere que el archivo se escanee dos veces(wcpara la primera pasada ).

sed "$(($(wc -l < yourfile)-$N))a"'new line' yourfile
1
27.01.2020, 20:13
tac input.txt | sed '2 a New line' | tac

Explicación

  • tac-imprime líneas al revés, por lo que la última línea se convierte en la primera, la línea last - 1se convierte en la segunda, etc.
  • sed '2 a New line-agregue New linedespués de la segunda línea.
  • tac-invierte las líneas de nuevo.

Prueba

$ tac <(seq 1 5) | sed '2 a New line' | tac
1
2
3
New line
4
5
0
27.01.2020, 20:13

Использованиеed:

$ printf '$-1i\nNew line\n.\n,p\n' | ed -s file
1
2
3
New line
4
5

Сценарий редактирования ed:

$-1i
New line
.
,p

Сначала выполняется переход к строке на одну строку вверх от конца($-1)и вставка(i)нового содержимого над этой строкой. Вставляемое содержимое заканчивается одиночной точкой (и может состоять из нескольких строк ). Последний ,pотображает на терминале полностью измененный буфер.

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

printf '$-1i\nNew line\n.\nw\n' | ed -s file

(,pменяется наw).

Это последнее также то, как вы могли бы аналогичным образом использовать exдля этой работы:

printf '$-1i\nNew line\n.\nw\n' | ex -s file

edи exявляются стандартными строковыми -ориентированными редакторами (, в отличие от полноэкранных -редакторов ), которые должны поставляться с вашей системой. Обратите внимание, что -sозначает разные вещи для каждого, но подходит для обоих при выполнении задач редактирования в пакетном режиме, подобных этой.

  • ed. «Шелл и утилиты». Базовые характеристики . IEEE 1003.1 :2017. Открытая группа.
  • ex. «Шелл и утилиты». Базовые характеристики . IEEE 1003.1 :2017. Открытая группа.

Дополнительная литература:

14
27.01.2020, 20:13

Теги

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