c00*_*ter 32
sed方式
$ echo '( 1 2 3 4 5 6 7 )' | sed 's/^.\(.*\).$/\1/'
1 2 3 4 5 6 7
Run Code Online (Sandbox Code Playgroud)
awk方式
$ echo '( 1 2 3 4 5 6 7 )' | awk '{print substr($0, 2, length($0) - 2)}'
1 2 3 4 5 6 7
Run Code Online (Sandbox Code Playgroud)
POSIX方式
$ var='( 1 2 3 4 5 6 7 )'; var="${var#?}"; var="${var%?}"; echo "$var"
1 2 3 4 5 6 7
Run Code Online (Sandbox Code Playgroud)
bash方式
$ var='( 1 2 3 4 5 6 7 )'; echo "${var:1: -1}"
1 2 3 4 5 6 7
Run Code Online (Sandbox Code Playgroud)
如果你使用bash然后使用bash方式.
如果没有,更喜欢posix-sh方式.它比加载sed或更快awk.
除此之外,您可能还在进行其他文本处理,您可以将其与此结合使用,因此根据脚本的其余部分,您可能会受益sed或awk最终使用.
为什么这不起作用?
sed '..' s_res.temp > s_res.temp?
这不起作用,因为重定向>将在读取之前截断文件.要解决这个问题,你有一些选择:
你真正想做的是编辑文件.sed是流编辑器而不是文件编辑器.
ed虽然,是一个文件编辑器(标准编辑器!).所以,使用ed:
$ printf '%s\n' "%s/^.\(.*\).$/\1/" "." "wq" | ed s_res.temp
Run Code Online (Sandbox Code Playgroud)使用临时文件,然后mv替换旧文件.
$ sed 's/^.\(.*\).$/\1/' s_res.temp > s_res.temp.temp
$ mv s_res.temp.temp s_res.temp
Run Code Online (Sandbox Code Playgroud)使用-i选项sed.这仅与GNU-sed的工作,因为-i是不是 POSIX和GNU-只:
$ sed -i 's/^.\(.*\).$/\1/' s_res.temp
Run Code Online (Sandbox Code Playgroud)滥用shell(不推荐真的):
$ (rm test; sed 's/XXX/printf/' > test) < test
Run Code Online (Sandbox Code Playgroud)在Mac OS X上(最新版本10.12 - Sierra)bash坚持使用3.2.57相当陈旧的版本.可以随时安装bash使用brew并获取4.x包含上述工作所需的替换的版本.
在bash-hackers wiki上编译了一系列bash版本和各自的更改
要从给定的字符串中删除第一个和最后一个字符,我喜欢这样sed:
sed -e 's/^.//' -e 's/.$//'
# ^^ ^^
# first char last char
Run Code Online (Sandbox Code Playgroud)
看一个例子:
sed -e 's/^.//' -e 's/.$//' <<< "(1 2 3 4 5 6 7)"
1 2 3 4 5 6 7
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
27675 次 |
| 最近记录: |