Один из способов может быть следующим:
sed -e '
/\n/s/\(.*\)\(\n\)\(.*\)/\3\2\1/;//b
$!N;$q;N; # load up the pattern space with 3 lines provided eof not reached
P;D; # first just print the first line then interchange the two and print them
' yourfile
В качестве альтернативы,
perl -ne 'print $_, reverse scalar <>, scalar <>' yourfile
gi_1234
I have a cat.
My cat is blue.
gi_5678
I also have a dog.
My dog is orange.
Для решения POSIX вы можете использовать Vim в режиме Ex:
ex -sc '%s/set autologout=10//g|x' /home/"$x"/.login
%
выбрать все строки
|
разделитель команд
x
записать в файл, если были внесены изменения (они есть), и выйти
"$ x "
в этом случае плохо оставлять переменную без кавычек
Комментарий @ don_crissti ссылается на тот факт, что BSD sed, похоже, требует аргумента для -i
, а если -e
isn не используется, первый аргумент принимается как команда sed
. Что не оставляет ничего для входного файла, по умолчанию это stdin
, и вы не можете редактировать его «на месте».
Это противоположно, скажем, GNU sed, в которой -i
принимает необязательный аргумент .
Или, другими словами, ваш sed
может интерпретировать s / set autologout = 10 // g
как параметр для -i
, расширение использовать для файла резервной копии. Поэтому, если вы не хотите оставлять файл резервной копии, просто укажите для параметра -i
пустой аргумент:
sed -i "" 's/set autologout=10//g' /home/$x/.login