Bash删除字符串中的第一个和最后一个字符


98

我有一个像这样的字符串:

|abcdefg|

而且我想以某种方式调用一个新字符串(如string2),而原始字符串|的开头和结尾都没有两个字符,这样我就可以得到:

abcdefg

有可能在bash中吗?

Answers:


120

你可以做

string="|abcdefg|"
string2=${string#"|"}
string2=${string2%"|"}
echo $string2

或者,如果您的字符串长度恒定,则可以

string="|abcdefg|"
string2=${string:1:7}
echo $string2

此外,这应该工作

echo "|abcdefg|" | cut -d "|" -f 2

还有这个

echo "|abcdefg|" | sed 's/^|\(.*\)|$/\1/'

2
以及awk -F\| '{ print $2 }' <<<"|string|"
enzotib 2011年

1
@enzotib您总是有很酷的awk解决方案。我需要学习awk
克里斯·哈珀

3
并且IFS='|' read string2 <<< $string:)
安排

10
而且,在bash 4.2及更高版本中,"${string:1:-1}"
盖尔哈(Geirha)2012年

阅读中的“参数扩展”部分man bash
Nemo 2012年

62

这是一个与字符串(bash)的长度无关的解决方案:

string="|abcdefg|"
echo "${string:1:${#string}-2}"

29

在这里列出的一些帖子看来,最简单的方法是:

string="|abcdefg|"
echo ${string:1:-1}

编辑:使用bash 4.2在ubuntu上工作;在使用bash 4.1的centOS上不起作用


19

另一种方法是使用headtail命令:

$ echo -n "|abcdefg|" | tail -c +2 | head -c -2
abcdefg

1
我有一连串的[something something]目标是削减括号,所以echo "[something something]" | tail -c +2 | head -c -2制定了计划。多谢小费!
艾因·托夫里

显然,它应该是echo -n "|abcdefg|" | tail -c +2 | head -c -1。我不确定为什么我的编辑被拒绝...老实说,这很可悲。查看man head更多信息
德米特里·哈米托夫


9

您也可以使用sed删除|。不仅引用符号本身,而且使用位置引用,如下所示:

$ echo "|abcdefg|" | sed 's:^.\(.*\).$:\1:'
abcdefg

其中“:”是定界符(您可以将它们替换为/或查询中未包含的任何字符,s后面的任何符号都可以做到)这里的^(插入符号)表示输入字符串的开头,$(表示美元)表示在末尾。的。(点)表示在插入符号之后,在美元符号之前表示一个字符。因此,换句话说,我们要删除第一个和最后一个字符。请记住,即使| 它不在字符串中。

例如:

$ echo "abcdefg" | sed 's:^.\(.*\).$:\1:'
bcdef

3

外壳功能

较为冗长的方法,但可用于任何第一个和最后一个字符,不必相同。基本思想是我们要获取一个变量,逐个字符地读取它,然后仅将想要添加的变量追加到新变量中

这是整个想法格式化为一个不错的功能

crop_string_ends() {
    STR="$1" 
    NEWSTR="" 
    COUNT=0 
    while read -n 1 CHAR 
    do
        COUNT=$(($COUNT+1)) 
        if [ $COUNT -eq 1 ] || [ $COUNT -eq ${#STR} ] 
        then
            continue 
        fi 
        NEWSTR="$NEWSTR"$CHAR 
    done <<<"$STR" 
    echo $NEWSTR 
}

这是作用相同的功能:

$> crop_string_ends "|abcdefg|"                                                                                       
abcdefg
$> crop_string_ends "HelloWorld"                                                                                      
elloWorl

蟒蛇

>>> mystring="|abcdefg|"
>>> print(mystring[1:-1])
abcdefg

或在命令行上:

$ python -c 'import sys;print sys.stdin.read()[1:-2]' <<< "|abcdefg|"                                             
abcdefg

AWK

$ echo "|abcdefg|" | awk '{print substr($0,2,length($0)-2)}'                                                      
abcdefg

红宝石

$ ruby -ne 'print $_.split("|")[1]' <<< "|abcdefg|"                                                               
abcdefg

2

小型通用解决方案:

expr "|abcdef|" : '.\(.*\).'

在这种情况下是特殊的,并允许'|' 字符是否存在:

expr "|abcdef" : '|*\([^|]*\)|*'

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.