从String中删除最后一个和第一个字符

时间:2012-09-11 03:01:48

标签: sed awk

使用awk / sed从字符串中剥离第一个和最后一个字符相当容易吗?

说我有这个字符串 ( 1 2 3 4 5 6 7 )

我想从中删除括号。

我该怎么做?

4 个答案:

答案 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方式。它比加载sedawk更快。

除此之外,您可能还在进行其他文本处理,您可以将其与此结合使用,因此根据脚本的其余部分,您最终可能会使用sedawk


  

为什么这不起作用? sed '..' s_res.temp > s_res.temp

这不起作用,因为重定向>会在读取文件之前截断该文件。 要解决这个问题,你有一些选择:

  1. 您真正想要做的是编辑该文件。 sed流编辑器而不是文件编辑器 ed虽然是文件编辑器(也是标准编辑器!)。因此,请使用ed

     $ printf '%s\n' "%s/^.\(.*\).$/\1/" "." "wq" | ed s_res.temp
    
  2. 使用临时文件,然后使用mv替换旧文件。

     $ sed 's/^.\(.*\).$/\1/' s_res.temp > s_res.temp.temp
     $ mv  s_res.temp.temp  s_res.temp
    
  3. 使用-i的{​​{1}}选项。这仅适用于GNU-sed,因为sed POSIX和GNU-only:

    -i
  4. 滥用shell(不推荐真的):

    $ sed -i 's/^.\(.*\).$/\1/' s_res.temp
    

  5. 在Mac OS X上(最新版本10.12 - Sierra) $ (rm test; sed 's/XXX/printf/' > test) < test 停留在版本bash上,这已经过时了。可以随时使用brew安装3.2.57并获取版本bash,其中包含上述工作所需的替换。

    bash-hackers wiki

    上汇编了一系列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/..$//'

`