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

довольно легко удалить первый и последний символ из строки с помощью awk/sed?

скажем, у меня есть эта строка ( 1 2 3 4 5 6 7 )

Я хотел бы снять с него скобки.

как я должен это сделать?

3 ответов


sed way

$ echo '( 1 2 3 4 5 6 7 )' | sed 's/^.\(.*\).$//'
 1 2 3 4 5 6 7 

awk way

$ echo '( 1 2 3 4 5 6 7 )' | awk '{print substr(, 2, length() - 2)}'
 1 2 3 4 5 6 7 

POSIX SH way

$ var='( 1 2 3 4 5 6 7 )'; var="${var#?}"; var="${var%?}"; echo "$var"
 1 2 3 4 5 6 7 

bash way

$ var='( 1 2 3 4 5 6 7 )'; echo "${var:1: -1}"
 1 2 3 4 5 6 7 

если вы используете bash затем используйте способ bash.

если нет, предпочитайте путь posix-sh. Это быстрее, чем загрузка sed или awk.

кроме этого, вы также можете выполнять другую обработку текста, которую вы можете объединить с этим, поэтому в зависимости от остальной части скрипта вы можете воспользоваться sed или awk в конце.


почему это не работает? sed '..' s_res.temp > s_res.temp ?

это не работает, так как перенаправление > будет обрезать файл, прежде чем он будет прочитан. Чтобы решить эту проблему, у вас есть несколько вариантов:

  1. то, что вы действительно хотите сделать, это edit файл. sed это редактор потока не редактор файлов.
    ed хотя, это редактор файлов (стандартный тоже!). Итак, используйте ed:

     $ printf '%s\n' "%s/^.\(.*\).$//" "." "wq" | ed s_res.temp
    
  2. используйте временный файл, а затем mv это, чтобы заменить старый.

     $ sed 's/^.\(.*\).$//' s_res.temp > s_res.temp.temp
     $ mv  s_res.temp.temp  s_res.temp
    
  3. использовать на sed. Это работает только с GNU-sed, as -i is не POSIX и только GNU:

    $ sed -i 's/^.\(.*\).$//' s_res.temp
    
  4. злоупотреблять оболочкой (не рекомендуется на самом деле):

     $ (rm test; sed 's/XXX/printf/' > test) < test
    

на Mac OS X (последняя версия 10.12 - Сьерра)bash застрял на версии 3.2.57 это довольно старый. Всегда можно установить bash используя brew и Вам версии 4.x который включает в себя замены, необходимые для работы выше.

существует коллекция версий bash и соответствующих изменений, скомпилированных на bash - хакеры wiki


чтобы удалить первый и последний символы из данной строки, Мне нравится это sed:

sed -e 's/^.//' -e 's/.$//'
#         ^^          ^^
# first char          last char

пример:

sed -e 's/^.//' -e 's/.$//' <<< "(1 2 3 4 5 6 7)"
1 2 3 4 5 6 7

а также путь perl:

perl -pe 's/^.|.$//g'