Переупорядочьте несколько блоков строки с Sed

Это - проблема полномочий, как определено этой строкой:

Полномочия 0644 для 'id_server_key' слишком открыты.

Это происходит, потому что Ваши полномочия слишком открыты на закрытом ключе, затем ssh не может гарантировать подлинность ключа и передумает относительно использования его.

Так принимая во внимание VFATness карты флэш-памяти (который не поддерживает изменение полномочий), Вы могли сделать что-то как добавление этой строки в /etc/fstab файл:

LABEL=USB none msdos -u=USERID,-m=PERMS

Где ИДЕНТИФИКАТОР ПОЛЬЗОВАТЕЛЯ является Вашим числовым идентификатором пользователя, и ПЕРМСКИЕ 700. Это должно сказать утилите автоматического монтирования всегда монтировать Карту памяти как того пользователя без прав для группы или другого.


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

chmod 700 /run/media/myself/USB/.ssh
chmod 400 /run/media/myself/USB/.ssh/id_server_key
4
05.02.2014, 20:01
2 ответа

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

awk -v RS='\\[1em\\]\n|\\\\hline' '
    !/[^[:space:]]/ {next} 
    /^Constant/ {c=$0; next} 
    {printf "[1em]\n%s", $0} 
    END {printf "[1em]\n%s\\hline\n", c}
'

Так как текст запускается и заканчивается "разделителем записей", существуют некоторые побочные записи пустого выхода, следовательно первое правило

1
27.01.2020, 21:00
  • 1
    Это полезно, хотя это производит несколько поврежденный вывод (это, кажется, заменяет любые обратные косые черты, существующие в источнике tex файл с' [1em] \n' (реальная новая строка)). Я думаю, что awk является, вероятно, правильным инструментом для этого так или иначе, так спасибо за подсказки. –  rjturn 25.02.2014, 23:56

Вот один из способов сделать это с помощью sed с использованием буфера удержания:

sed '/\[1em\]/{N;/Constant/{N;x;/^$/d;x};/Semester/{x;/^$/!{H;x};//g}}' file

В каждой строке соответствует [1em] it читает в строке N ext, а затем

  1. Если пространство шаблонов совпадает с Константа , она читает в другой строке N , e x ] изменяет буферы, и если пространство шаблонов представляет собой просто пустую строку (это означает, что буфер хранения был пуст перед обменом), то выбирается d . Если пространство шаблонов не является пустой строкой (что означает, что в пространстве удержания было что-то из-за 2 ), e x снова изменяет буферы, возвращая линии в пространстве образца.
  2. Если пространство шаблонов соответствует Semester it e x изменяет буферы, тогда, если пространство шаблонов не пусто, это означает строки [1em] \ nConstant. * были в буфере удержания, поэтому он добавляет их к строкам [1em] \ nSemester. * (которые сейчас находятся в буфере удержания), а затем e x изменяет буферы очередной раз.Если пространство шаблонов пусто, это означает, что строки [1em] \ nConstant. * находятся после строки Semester , поэтому он просто копирует пространство удержания поверх пространства шаблонов. Таким образом восстанавливаются строки [1em] \ nSemester. * , но теперь в буфере удержания есть что-то , когда он достигает 1 .

Таким образом, строки [1em] \ nConstant. * перемещаются, только если они находятся до [1em] \ nSemester. * , иначе ничего не произойдет.

sed '/\[1em\]/{             # if line matches [1em]
N                           # read in the next line
/Constant/{                 # if pattern space matches Constant
N                           # read in another line
x                           # exchange buffers
/^$/d                       # if pattern space is now empty, delete it
x                           # otherwise, exchange again
}
/Semester/{                 # if pattern space matches Semester
x                           # exchange buffers
/^$/!{                      # if pattern space is not empty
H                           # append it to hold space
x                           # then exchange buffers
}
//g                         # if pattern space is currently empty
}                           # copy the hold space over the pattern space
}' infile                   # so now the hold space is no longer empty

Это проще с изданием . Просто выберите диапазон строк и переместите его после соответствия строки Семестр :

ed -s infile <<<$'/Constant/-1,/Constant/+1m/Semester/\n,p\nq'

замените , p на w , чтобы записать изменения в файл:

ed -s infile <<IN
/Constant/-1,/Constant/+1m/Semester/
w
q
IN
1
27.01.2020, 21:00

Теги

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