16

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

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

我想从中去掉括号。

我该怎么做?

4

4 回答 4

48

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 方式。它比加载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的选项sed。这仅适用于 GNU-sed,而-i不是POSIX和 GNU-only:

    $ sed -i 's/^.\(.*\).$/\1/' s_res.temp
    
  4. 滥用外壳(真的不推荐):

     $ (rm test; sed 's/XXX/printf/' > test) < test
    

在 Mac OS X(最新版本 10.12 - Sierra)bash上,卡在了3.2.57相当旧的版本上。始终可以bash使用brew并获取4.x包含上述工作所需替换的版本。

bash-hackers wiki上编译了 bash 版本和相应更改的集合

于 2012-09-11T03:05:40.243 回答
5

要从给定字符串中删除第一个和最后一个字符,我喜欢这样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
于 2015-11-27T13:23:39.973 回答
1

还有一种 perl 方式:

perl -pe 's/^.|.$//g'
于 2013-09-25T14:36:17.350 回答
1

如果我想使用 sed 删除前 (1) 个字符和后两 (2) 个字符。

输入 "t2.large",

输出t2.large

sed -e 's/^.//' -e 's/..$//'

`

于 2021-02-17T06:23:06.070 回答