使用awk
/ sed
从字符串中剥离第一个和最后一个字符相当容易吗?
说我有这个字符串
( 1 2 3 4 5 6 7 )
我想从中删除括号。
我该怎么做?
答案 0 :(得分:31)
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
更快。
除此之外,您可能还在进行其他文本处理,您可以将其与此结合使用,因此根据脚本的其余部分,您最终可能会使用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
的{{1}}选项。这仅适用于GNU-sed,因为sed
不 POSIX和GNU-only:
-i
滥用shell(不推荐真的):
$ sed -i 's/^.\(.*\).$/\1/' s_res.temp
在Mac OS X上(最新版本10.12 - Sierra) $ (rm test; sed 's/XXX/printf/' > test) < test
停留在版本bash
上,这已经过时了。可以随时使用brew
安装3.2.57
并获取版本bash
,其中包含上述工作所需的替换。
答案 1 :(得分:1)
要删除给定字符串中的第一个和最后一个字符,我喜欢这个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
答案 2 :(得分:0)
还有一种perl方式:
perl -pe 's/^.|.$//g'
答案 3 :(得分:0)
如果我想使用 sed 删除第一个 (1) 字符和最后两 (2) 个字符。
输入"t2.large",
输出t2.large
sed -e 's/^.//' -e 's/..$//'
`