удаление первого и последнего знака каждой строки из командной строки

Существует пара способов сделать это с :sВ зависимости от того, сколько ввода Вас хотят сделать. Самым легким путем является простой поиск и замена:

:%s/find this line/replace with this/

% будет искать целый файл и заменять все случаи.

Если это очень вводит для Вас, можно дергать целевую строку (yy) и используйте " регистр (по умолчанию), вставляя его с Ctrl+r ":

:%s/<ctrl+r><">/replacement/

Или, если у Вас есть копия замещающей строки, можно дергать два в отдельные регистры с "ayy и "byy дергать в a и b регистры, соответственно (можно использовать любую букву для регистров). Затем используйте Ctrl+r a и Ctrl+r b для вставки их в поля замены и поиск.

Для не переигрывания Bruce но если Вы хотите проверить строки перед заменой их, просто добавьте c опция:

:%s/find this line/replace with this/c
8
11.01.2013, 01:06
5 ответов

Иначе только для heck его:

rev input | cut -c2- | rev | cut -c2-

(Примечание: с GNU cut, это только работает на символы, сделанные только из одного байта (как в Вашем примере)).

13
27.01.2020, 20:08
  • 1
    Хороший! Это значительно быстрее, чем sed и awk решения, предложенные до сих пор. –  Gilles 'SO- stop being evil' 11.01.2013, 01:13
  • 2
    я предложил этот ответ для людей, боящихся sed/awk/regex синтаксиса, но не буду предполагать, что это быстрее, специально для больших файлов, с тремя каналами и передачей всего содержания через каждого. Думал бы sed или awk, чтение строки за один раз будет более эффективным для больших файлов. –  Drake Clarris 14.01.2013, 15:35
  • 3
    Угадайте, что это - то, что 40 + годы оптимизации многих из них *отклоняют утилиты, получит Вас! –  Drake Clarris 14.01.2013, 15:36
  • 4
    @Gilles, это быстрее к GNU sed в utf8 локалях для некоторых форм входа, и это зависит, полагаете ли Вы, что стена показывает время или процессорное время. ssed или Семейная реликвия toolchest sed может достигнуть лучшей производительности. –  Stéphane Chazelas 18.01.2013, 17:09
  • 5
    @Gilles дисплея нет никакой записи ЧЕЛОВЕКА для версии в Солярисе 5.10. Я закончил тем, что использовал sed –  ayrton_senna 12.06.2015, 21:22

Согласно Вам вопрос удаляют последнее и первое слово из входного файла как указано ниже:

sed 's/.$//; s/^.//' inputfile
10
27.01.2020, 20:08
  • 1
    Было бы здорово, если Вы могли бы сравнить их с другим решением, s/.\(.*\).$/\1/. Это могло бы быть быстрее в связи с не использованием обратных ссылок, и вопрос действительно упоминал "большие файлы". –  l0b0 10.01.2013, 15:52
  • 2
    @l0b0 я протестировал с time yes | head -n 10000000 | COMMAND >/dev/null. Я добираюсь rev input | cut -c2- | rev | cut -c2- → 0,14 с, sed 's,.\(.*\).$,\1,' → 3,38 с; awk '{print substr($0,2,length()-2);}' → 3,50 с; sed 's/.$//; s/^.//' → 5.09s. –  Gilles 'SO- stop being evil' 11.01.2013, 01:09
  • 3
    @Gilles +1, Который должен быть ответом. –  l0b0 11.01.2013, 09:58
  • 4
    @Gilles, это - очень короткие строки. Я нахожу, что для 30 символьных широких строк, решение @RahulPatil в 3 раза более быстро с GNU sed, чем @juampa. Также. sed 's/.\(.*\)./\1/' кажется, быстрее, чем sed 's/^.\(.*\).$/\1/' (GNU sed снова). Кроме того, производительность является иждивенцем на локали (интерпретация того, что символ), и sed реализация (в том отношении, sed от семейной реликвии toolchest значительно быстрее, чем GNU sed). –  Stéphane Chazelas 18.01.2013, 17:00

Существует много возможностей, как всегда

sed 's,.\(.*\).$,\1,g' your_file

Объяснение

  • , - sed разделитель, может быть любой другой символ также, учитывая его оставлен, где когда-либо необходимый.
  • . Соответствуйте отдельному символу
  • \(.*\) - Сгруппируйте остающуюся часть, и это хранится, чтобы быть, получают далее.
  • . Соответствуйте отдельному символу снова
  • $ - Конец строки
  • \1 - произведите текст, подобранный группой выше
  • g замените глобально на строке.
5
27.01.2020, 20:08
  • 1
    Почему g? на строку будет только одно соответствие. –  njsg 10.01.2013, 12:07
  • 2
    Обратите внимание, что это ничего не удалит из строк, которые имеют меньше чем 2 символа. –  Stéphane Chazelas 18.01.2013, 16:46

Можно также сделать это с awk если Вы предпочитаете

awk '{print substr($0,2,length()-2);}' input.txt > output.txt
3
27.01.2020, 20:08
tr -d '()[]{}"' < your_file

Это должно работать так хорошо. Это хорошо «перевести» каждый из персонажей ничем (удалить).

Недостатком является то, что он удалит их, если они также не первый / последний символ. Он также пропустит любые окончательные символы, которые вы не перечислите в () [... .

2
27.01.2020, 20:08

Теги

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