удалить последний и первый символ из строки
довольно легко удалить первый и последний символ из строки с помощью 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
?
это не работает, так как перенаправление >
будет обрезать файл, прежде чем он будет прочитан.
Чтобы решить эту проблему, у вас есть несколько вариантов:
-
то, что вы действительно хотите сделать, это edit файл.
sed
это редактор потока не редактор файлов.ed
хотя, это редактор файлов (стандартный тоже!). Итак, используйтеed
:$ printf '%s\n' "%s/^.\(.*\).$//" "." "wq" | ed s_res.temp
-
используйте временный файл, а затем
mv
это, чтобы заменить старый.$ sed 's/^.\(.*\).$//' s_res.temp > s_res.temp.temp $ mv s_res.temp.temp s_res.temp
-
использовать на
sed
. Это работает только с GNU-sed, as-i
is не POSIX и только GNU:$ sed -i 's/^.\(.*\).$//' s_res.temp
-
злоупотреблять оболочкой (не рекомендуется на самом деле):
$ (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