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

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

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

Я хотел бы удалить из него скобки.

Как мне это сделать?

Ответ 1

sed way

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

awk way

$ echo '( 1 2 3 4 5 6 7 )' | awk '{print substr($0, 2, length($0) - 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 способ

$ 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.

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


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

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

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

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

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

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

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

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

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

Ответ 2

Чтобы удалить первый и последний символы из данной строки, мне нравится это 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

Ответ 3

А также способ perl:

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