删除特定长度的字符

时间:2016-04-21 05:21:22

标签: shell awk sed

如何使用shell脚本从文件中删除指定长度的字符集。 例如:

文件名:abc.txt

helloshell

现在我如何删除从8到10开头的字符(最后是ell)?

我在Linux服务器上尝试过sed -r命令,但它不能在AIX服务器上运行。

Linux命令:

sed -r 's/.(.{3}).*/\1/' filename.txt

3 个答案:

答案 0 :(得分:1)

使用Bash(从0到7字符提取子字符串):

str="helloshell"
echo ${str:0:7}

使用sed(从第7位开始删除3个字符):

str="helloshell"
startpos=7;
nbchar=3;
echo "$str" | sed "s/^\(.\{$startpos\}\).\{$nbchar\}\(.*\)/\1\2/"

答案 1 :(得分:0)

如果您总是希望删除最后3个,请尝试此操作。

echo helloshell | sed 's/...$//'

8-10试试这个:

echo helloshell | sed 's/\(.\{7\}\).../\1/'
echo helloshellHowAreYou | sed 's/\(.\{7\}\).../\1/'

对于AIX,您可能需要从\

中删除\{
sed 's/\(.{7}\).../\1/'

如果搜索字符串中存在您想要的模式,则必须调整\(\)

中的值

答案 2 :(得分:0)

$ sed -r 's/^(.{7}).{0,3}(.*)$/\1\2/g'
helloshell
hellosh
1234567890
1234567
$

{0,3}确保从第8个位置起3个或更少的字符(0,3表示仅在存在时删除,因此也从第8个位置删除1/2/3个字符)即匹配并删除最小0个字符(对于无字符) )和最多3个字符

如果你只需要从第8个位置删除3个字符,请使用{3}但是如果少于3个字符,它不会从第8个位置删除字符,例如:

$ sed -r 's/^(.{7}).{3}(.*)$/\1\2/g'
123456789
123456789
$

Edit1:

你可以使用它而不使用-r开关和一些转义:sed 's/^\(.\{7\}\).\{0,3\}\(.*\)$/\1\2/g'

如果只执行以BH开头的行,则可以为替换命令添加限制,如下所示:

sed '/^BH/s/^\(.\{7\}\).\{0,3\}\(.*\)$/\1\2/g'

/^BH/s..将确保仅在以BH

开头的行上执行替换
$ sed '/^BH/s/^\(.\{7\}\).\{0,3\}\(.*\)$/\1\2/g'
BHhelloshell
BHhelloll
BH123456789
BH123459
helloshell
helloshell
$

要在计算时排除BH,您可以使用:

$ sed '/^BH/s/^BH\(.\{7\}\).\{0,3\}\(.*\)$/BH\1\2/g'
BHhelloshell
BHhellosh
BH123456789
BH1234567
helloshell
helloshell
$