Ответ 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