从文件中删除前九个字符和后两个字符

从文件中删除前九个字符和后两个字符

我需要将其转换hello123456789567使用sed来删除前九个字符和最后两个字符。

我一直在寻找一个命令,只是找不到一个命令,我尝试了几种语言来执行一个函数,但没有运气。

答案1

sed 's/^.........\(.*\)..$/\1/' file

或者

sed 's/^.\{9\}\(.*\)..$/\1/' file

或者,使用非标准但普遍实现的-E选项来启用扩展正则表达式,

sed -E 's/^.{9}(.*)..$/\1/' file

所有这些首先匹配行开头的九个字符,然后匹配行中间的任意数量的字符(这些字符被捕获),最后匹配末尾的两个字符。这里实际上不需要使用^and$进行锚定,因为表达式的中间部分无论如何都会强制表达式的第一位和最后一位在行的开头和结尾处匹配。整行都被中间捕获的字符所取代,无论它们有多少。

另一种方法sed

sed -e 's/.\{9\}//' -e 's/..$//' file

第一个表达式通过将前九个字符替换为空来删除前九个字符,第二个表达式以类似的方式删除最后两个字符。第二个表达式需要用 锚定在行尾$,但第一个表达式不需要锚定,因为它默认从行首匹配。


如果字符串位于 shell 变量中var,则使用这两个标准变量替换将首先删除字符串的前九个字符,然后删除字符串的最后两个字符(?在 shell 通配模式中使用时匹配任何字符):

var=${var#?????????}
var=${var%??}

这模仿了上面的最后一个变体sed,它匹配并删除字符串开头和结尾处的一定数量的字符,而根本不关心字符串的中间部分。

测试这个:

$ var=hello123456789
$ var=${var#?????????}
$ var=${var%??}
$ printf '%s\n' "$var"
567

答案2

使用 bash 参数扩展:

string=hello123456789
echo ${string:9:-2}
567

答案3

为了不遗漏awk解决方案:

awk -v s=9 -v e=2 '{ print substr($0, s+1, length()-s-e ) }' infile

substr(字符串, 起始位置, 长度)

答案4

另一种(bash)奇特的方式:

str="hello123456789"
[[ "$str" =~ ^.{9}(.*).{2}$ ]]
echo "${BASH_REMATCH[1]}"

相关内容