如何从字符串前面“删除”/删除字符?

如何从字符串前面“删除”/删除字符?

我有一个想要操纵的字符串。该字符串是H08W2345678我如何能够操纵它以便输出只是W2345678

同样,如果我想删除最后 4 个字符,H08W2345678以便我知道H08W234我该怎么做?

答案1

只需使用 bash (或者ksh93该语法来自 or zsh):

string="H08W2345678"

echo "${string:3}"
W2345678

echo "${string:0:-4}"
H08W234

有关更多信息,请参阅 Wooledge wiki字符串操作

答案2

$ echo "H08W2345678" | sed 's/^.\{3\}//'
W2345678

sed 's/^.\{3\}//'将找到前三个字符^.\{3\}并替换为空白。这里^.将匹配字符串开头的任何字符(^表示字符串的开头),并且\{3\}将与前面的模式精确匹配 3 次。因此,^.\{3\}将匹配前三个字符。

$ echo "H08W2345678" | sed 's/.\{4\}$//'
H08W234

同样,sed 's/.\{4\}$//'将用空白替换最后四个字符($表示字符串的结尾)。

答案3

如何从字符串前面“删除”/删除字符?

我有一个想要操纵的字符串。该字符串是 H08W2345678 我如何才能操作它,以便输出只是 W2345678?

echo "H08W2345678" | cut -c 4-

同样,如果我想删除 H08W2345678 中的最后 4 个字符,以便得到 H08W234,我该怎么做?

echo "H08W2345678" | cut -c -7

答案4

和:

string="H08W2345678"

匹配 3 或 4 个字符似乎很简单(对于大多数 shell):

$ printf '%s\t%s\n' "${string#???}" "${string%????}"
W2345678      H08W234

对于较旧的 shell(例如 Bourne shell),请使用:

$ string=H08W2345678

$ expr " ${string}" : " ...\(.*\)"
W2345678

$ expr " ${string}" : " \(.*\)...." '
H08W234

如果需要字符的数字计数,请使用:

$ expr " ${string}" : " .\{3\}\(.*\)"
W2345678

$ expr " ${string}" : " \(.*\).\{4\}" '
H08W234

当然,这些正则表达式也适用于 sed、awk 和 bash 3.0+:

$ echo "$string" | sed 's/^.\{3\}//'
W2345678

$ echo "$string" | sed 's/.\{4\}$//'
H08W234

$ echo "$string" | awk '{sub(/^.{3}/,"")}1'
W2345678

$ echo "$string" | awk '{sub(/.{4}$/,"")}1'
H08W234

$ r='^.{3}(.*)$'; [[ $a =~ $r ]] && echo "${BASH_REMATCH[1]}"
W2345678

$ r='^(.*).{4}$'; [[ $a =~ $r ]] && echo "${BASH_REMATCH[1]}"
H08W234

相关内容