gpt4 book ai didi

sed - 从字符串中删除最后一个和第一个字符

转载 作者:行者123 更新时间:2023-12-02 19:40:20 25 4
gpt4 key购买 nike

使用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

awk方式

$ 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 方式

$ 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最后。

<小时/>

why doesn't this work? 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. 使用sed-i选项。这只适用于 GNU-sed,因为 -i 不适用于 POSIX 和 GNU-only:

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

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

在 Mac OS X(最新版本 10.12 - Sierra)上,bash 坚持使用相当旧的版本 3.2.57。人们总是可以使用 brew 安装 bash并获取版本 4.x,其中包括上述工作所需的替换。

有一个 bash 版本和相应更改的集合,编译于 bash-hackers wiki

关于sed - 从字符串中删除最后一个和第一个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12362142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com