Самый быстрый способ переместить строку в текстовом файле перед другой строкой в текстовом файле?

Добавить функцию фильтра в/usr/share/zsh/functions/Completion/Unix/_hosts:

provide_missing_ip() {
   while read x ; do 
      set -- $x
      if [ ! "$1" ] || [ "${1%%[^#]*}" ] || [ "$2" ] ; then
          echo "$x"
      else
          ip=`dig +short $2`
          [ "$ip" ] || ip="240.0.0.0"
          printf "%s\t%s\n" $1 $2
      fi
   done
}

Как это работает:

  1. Если есть две записи, пробел или комментарий, просто выведите их.
  2. Если есть только имя хоста, попробуйте предоставить IP-адрес с dig.
  3. В противном случае, (чего не должно произойти, но, скажем, это намеренно поддельное имя хоста для целей тестирования ), используйте безвредный фиктивный IP-адрес " 240.0.0.0 ", (см.ответ Бандрами на " IP-адрес, эквивалентный /dev/null ").

Используйте новую функцию для анализа вывода getentили < /etc/hostsв проблемном коде завершения:

if (( ${+commands[getent]} )); then
  _cache_hosts=(${(s: :)${(ps:\t:)${(f)~~"$(_call_program hosts getent hosts 2>/dev/null | provide_missing_ip )"}##${~ipstrip}}})
else
  _cache_hosts=(${(s: :)${(ps:\t:)${${(f)~~"$(provide_missing_ip 

7
21.07.2019, 22:11
3 ответа

Редактор с поддержкой сценариев делает это довольно просто -вперед!

printf '%s\n' '55m22' 'wq' | ed -s input

Это отправляет две командыed(для редактирования файла с именем input):

.
  1. 55m22--переместить строку 55 после строки 22
  2. wq--сохранить файл обратно на диск и выйти.
11
27.01.2020, 20:15

Чуть короче:

ex input <<<"55m22|wq"
4
27.01.2020, 20:15

В viоно несколько длиннее, чем в ed:

.
vi input
55Gdd23GPZZ

55G... перейти к строке 55
dd... удалить одну строку
23G... перейти к строке 23
P... вставьте удаленную строку перед строкой 23
ZZ... записать файл и выйти

3
27.01.2020, 20:15

Теги

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