Легко лишить первый и последний символ из строки с помощью awk
/sed
?
Скажем, у меня есть эта строка
( 1 2 3 4 5 6 7 )
Я хотел бы удалить из него скобки.
Как мне это сделать?
Легко лишить первый и последний символ из строки с помощью awk
/sed
?
Скажем, у меня есть эта строка
( 1 2 3 4 5 6 7 )
Я хотел бы удалить из него скобки.
Как мне это сделать?
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
Чтобы удалить первый и последний символы из данной строки, мне нравится это 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'