使用sed(或awk)删除最后一个字符之前的4个字符

使用sed(或awk)删除最后一个字符之前的4个字符,awk,sed,Awk,Sed,我想删除最后一个字符之前的4个字符 输入: abc2a982 e1kei9e5bc5 e1edeaww58476 预期产出: abc2 e1kei95 e1edeaww6 到目前为止,我已经尝试: cat file | while read line; do echo $line | sed 's/.\{4}$\1/';done 我想应该有别的东西来代替\1如果您想单独使用bash来实现这一点,并且避免使用sed,那么您可以使用sed来操作字符串 % cat input | sed 's/

我想删除最后一个字符之前的4个字符

输入

abc2a982
e1kei9e5bc5
e1edeaww58476
预期产出

abc2
e1kei95
e1edeaww6
到目前为止,我已经尝试:

cat file | while read line; do echo $line | sed 's/.\{4}$\1/';done

我想应该有别的东西来代替
\1

如果您想单独使用bash来实现这一点,并且避免使用sed,那么您可以使用sed来操作字符串

% cat input | sed 's/....\(.\)$/\1/'
abc2
e1kei95
e1edeaww6
while read -r line; do
  allbutlast1="${line%?}"          # strip the last character from $line
  lastchar="${line#$allbutlast1}"  # strip what we just captured from start of line
  allbutlast5="${line%?????}"      # strip the last 5 characters
  printf '%s%s\n' "$allbutlast5" "$lastchar"
done
或者,如果您使用bash作为shell,您有:

(压缩bash代码以保存丢弃的变量。)

POSIX代码(第一个示例)使用参数扩展来构造输出。Bash代码使用
${var:start:length}
表示法,带有,
$(…)

此答案主要用于学术目的。与使用shell脚本逐行处理输入相比,使用awk或sed可以获得更好的性能

说到这里,awk解决方案可能会镜像bash解决方案:

awk '{print substr($0,1,length($0)-5) substr($0,length($0))}'

请注意,虽然bash的
${var:start:length}
表示法从零开始为字符编号,但awk的
substr()
函数从一开始。

可能重复LOL,除非“cat input”是更复杂管道的占位符。实际上,我尝试了这个解决方案,但我的错误是我将“\(.\”放在“为了所有人”。“但是第一个”。@achille-这不包括在你的问题中,但它应该仍然有效。您可以只计算括号内的表达式,然后选择要放在替换字符串中的表达式
's/…\(.\)$/\1/'
在功能上等同于
's/\(.\)\(.\)\(.\)\(.\)\(.\)$/\5/'
.Bash4.3或更高版本可以执行
printf“%s%s\n'${line:0:-5}”“${line:(.1)}”
.Nice。谢谢你。:)
awk '{print substr($0,1,length($0)-5) substr($0,length($0))}'