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

use*_*893 11 awk sed

使用awk/ 删除字符串中的第一个和最后一个字符相当容易sed吗?

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

我想从中删除括号.

我该怎么做?

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.

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


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

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

  1. 你真正想做的是编辑文件.sed流编辑器而不是文件编辑器.
    ed虽然,是一个文件编辑器(标准编辑器!).所以,使用ed:

     $ printf '%s\n' "%s/^.\(.*\).$/\1/" "." "wq" | ed s_res.temp
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用临时文件,然后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)
  3. 使用-i选项sed.这仅与GNU-sed的工作,因为-i不是 POSIX和GNU-只:

    $ sed -i 's/^.\(.*\).$/\1/' s_res.temp
    
    Run Code Online (Sandbox Code Playgroud)
  4. 滥用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版本和各自的更改

  • 使用 OS X Yosemite(确切地说是 GNU bash,版本 3.2.53(1)-release (x86_64-apple-darwin14)),我得到了 Bash 版本的 `-bash: -1: substring expression &lt; 0`。以下确实有效:`var='( 1 2 3 4 5 6 7 )'; echo "${var:1: ${#var}-2}"` (2认同)

fed*_*qui 5

要从给定的字符串中删除第一个和最后一个字符,我喜欢这样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)