awk
使用/从字符串中删除第一个和最后一个字符相当容易sed
吗?
说我有这个字符串
( 1 2 3 4 5 6 7 )
我想从中去掉括号。
我该怎么做?
sed方式
$ echo '( 1 2 3 4 5 6 7 )' | sed 's/^.\(.*\).$/\1/'
1 2 3 4 5 6 7
笨方法
$ echo '( 1 2 3 4 5 6 7 )' | awk '{print substr($0, 2, length($0) - 2)}'
1 2 3 4 5 6 7
POSIX 方式
$ var='( 1 2 3 4 5 6 7 )'; var="${var#?}"; var="${var%?}"; echo "$var"
1 2 3 4 5 6 7
重击方式
$ 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
的选项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
包含上述工作所需替换的版本。
要从给定字符串中删除第一个和最后一个字符,我喜欢这样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'
如果我想使用 sed 删除前 (1) 个字符和后两 (2) 个字符。
输入 "t2.large",
输出t2.large
sed -e 's/^.//' -e 's/..$//'
`