我有一个像这样的字符串:
|abcdefg|
而且我想以某种方式调用一个新字符串(如string2),而原始字符串|
的开头和结尾都没有两个字符,这样我就可以得到:
abcdefg
有可能在bash中吗?
我有一个像这样的字符串:
|abcdefg|
而且我想以某种方式调用一个新字符串(如string2),而原始字符串|
的开头和结尾都没有两个字符,这样我就可以得到:
abcdefg
有可能在bash中吗?
Answers:
你可以做
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/'
awk
解决方案。我需要学习awk
。
IFS='|' read string2 <<< $string
:)
"${string:1:-1}"
man bash
。
您也可以使用sed删除|。不仅引用符号本身,而且使用位置引用,如下所示:
$ echo "|abcdefg|" | sed 's:^.\(.*\).$:\1:'
abcdefg
其中“:”是定界符(您可以将它们替换为/或查询中未包含的任何字符,s后面的任何符号都可以做到)这里的^(插入符号)表示输入字符串的开头,$(表示美元)表示在末尾。的。(点)表示在插入符号之后,在美元符号之前表示一个字符。因此,换句话说,我们要删除第一个和最后一个字符。请记住,即使| 它不在字符串中。
例如:
$ echo "abcdefg" | sed 's:^.\(.*\).$:\1:'
bcdef
较为冗长的方法,但可用于任何第一个和最后一个字符,不必相同。基本思想是我们要获取一个变量,逐个字符地读取它,然后仅将想要添加的变量追加到新变量中
这是整个想法格式化为一个不错的功能
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
$ echo "|abcdefg|" | awk '{print substr($0,2,length($0)-2)}'
abcdefg
$ ruby -ne 'print $_.split("|")[1]' <<< "|abcdefg|"
abcdefg
$ string="|abcdefg|"
$ string="${string#?}" && string="${string%%?}"
$ echo "$string"
abcdefg
来自http://tldp.org/LDP/abs/html/parameter-substitution.html
${var#Pattern}
从取出$var
的最短的一部分$Pattern
,该匹配前端的$var
。 从取出的最长的一部分,该匹配后端的。
${var%%Pattern}
$var
$Pattern
$var
awk -F\| '{ print $2 }' <<<"|string|"