] У меня был такой же problam и мне удалось собрать mini Linux, следуя следующим шагам. [
] [][][
] []linux. img[
]), которые содержат linux. img grub или syslinux устанавливают процесс загрузки системы[]sync[
] syslinux, чтобы закончить linux. img image ;[]qemu[
], например, следующая команда []qemu linux.img[
][]Но текущие попытки не могут войти в терминал ( shell )[
] []Я оставляю эти шаги здесь в случае, если они могут помочь кому-нибудь или кто-нибудь может помочь мне.[
]. В Unix есть эти замечательные маленькие инструменты, которые называются вырезать
и вставить
. Инструмент вырезать
будет извлекать набор столбцов из своего ввода, а инструмент вставить
вставляет столбцы. Мы будем их использовать.
Я не собираюсь слишком заботиться о вашем конвейере (прямо сейчас, но посмотрите конец этого ответа), меня просто беспокоит проблема переключения столбцов.
Допустим, у меня есть эти данные в файле с именем cols.txt
:
$ cat cols.txt
1 a
2 b
3 c
$ paste -d ' ' cols.txt cols.txt
1 a 1 a
2 b 2 b
3 c 3 c
Утилита paste
обычно вставляет табуляцию между столбцами, но здесь мы сказали ей вставить вместо него пробел ( -d ''
).
Затем нужно просто извлечь второй и третий столбцы из вывода paste
с помощью cut
:
$ paste -d ' ' cols.txt cols.txt | cut -d ' ' -f 2,3
a 1
b 2
c 3
Мы сказали cut
что у нас есть пробелы в качестве «разделителей полей» ( -d ''
, иначе ожидаются табуляции) и что мы хотели бы иметь поля 2 и 3 ( -f 2,3
) , пожалуйста. (К сожалению, простой запрос cut
для столбцов « 2,1
» в исходном вводе не не поменяет местами столбцы.)
Итак, в конце концов, есть здесь действительно нет необходимости в беспорядочной магии регулярных выражений.
Вернемся к вашему конвейеру. Давайте отбросим это.Кажется, что вы хотите вставить номер строки в каждую строку. Для этого есть еще один инструмент Unix, который называется nl
("числовые строки"):
$ nl abc.txt
1 a
2 b
3 c
По умолчанию у вас есть номера строк для каждой непустой строки, которым предшествуют некоторые пробелы для заполнения и отделяются от исходной строки символом символ табуляции. Хотите ли вы также пронумеровать пустые строки, используйте
$ nl -b a abc.txt
Насколько я знаю, вы не можете заставить nl
поместить номера строк справа от строки, но это не проблема, потому что мы есть решение, которое меняет местами два столбца ввода:
$ paste <(nl abc.txt) <(nl abc.txt) | cut -f 2,3
a 1
b 2
c 3
Мы отказались от указания здесь разделителей. nl
вставит пробелы, за которыми следует номер строки и табуляция в начале каждой строки. paste
вставляет вкладку между столбцами, а cut
разрезает вкладки, так что это будет работать.
Если вы хотите, чтобы между столбцами был один пробел (теперь есть табуляция и несколько пробелов), добавьте | tr -s '\ t' ''
команде. Это изменит («транслитерирует») все табуляции на пробелы и «сожмет» ( -s
) полученные последовательные пробелы в один пробел.
Если вы хотите вместо этого использовать запятую и пробел, используйте | tr '\ t' ','
вместо:
$ paste <(nl abc.txt) <(nl abc.txt) | cut -f 2,3 | tr -s '\t ' ', '
a, 1
b, 2
c, 3
Это работает с файлом с несколькими словами в каждой строке, но не работает с файлами, содержащими символы табуляции:
$ cat abc.txt # no tabs in this file though
a text there is a
b goes hole in my
c here pants
$ paste <(nl abc.txt) <(nl abc.txt) | cut -f 2,3
a text there is a 1
b goes hole in my 2
c here pants 3
sed '/./=' | sed '/./{N; s/\(.*\)\n\(.*\)/\2 \1/;}'
Но awk
было бы более Stereighforward:
awk '/./ {$0 = $0 " " NR}; {print}'
кажется странным, что вы только номер линейки содержат хотя бы один символ. Если это не было вашим намерением, то вы можете изменить его на:
sed = | sed 'N; s/\(.*\)\n\(.*\)/\2 \1/'
awk '{print $0, NR}'
Другим способом выполнения задачи будет использование команды nl
с опцией -nln
. Это пронумерует строки из файла. Например.
-e "a\nb\nc\n". | nl -nln -
выдаст:
1 a
2 b
3 c
Теперь осталось только переместить числа справа от слов. Это можно сделать с помощью sed
следующим образом:
sed 's/^\([^ \t]*\)[ \t]*\([^ \t].*\)$/\2 \1/g'
Что это делает, так это находит первое слово в строке (Чтобы найти первое слово, нужно включить только те символы, которые не являются пробелами и табуляциями. Это делается с помощью [^ \t]
) и запоминается как \1
, а часть строки, следующая за пробелами, как \2
и заменяет строку на \2 \1
.
Итак, заключительной командой будет
имя файла кошки | nl -nln - | sed 's/^\([^ \t]*\)[ \t]*\([^ \t].*\)$/\2 \1/g'