我想在最后一个字符之前删除4个字符。
输入:
abc2a982
e1kei9e5bc5
e1edeaww58476
预期输出:
abc2
e1kei95
e1edeaww6
到目前为止,我已经尝试过:
cat file | while read line; do echo $line | sed 's/.\{4}$\1/';done
我猜应该有别的东西而不是\1
。
答案 0 :(得分:4)
% cat input | sed 's/....\(.\)$/\1/'
abc2
e1kei95
e1edeaww6
答案 1 :(得分:0)
如果您有单独使用bash执行此操作的冲动,并且避免使用sed,则可以使用parameter expansion来操纵您的字符串。
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,则可以使用additional options:
while read -r line; do
printf '%s%s\n' "${line:0:$(( ${#line} - 5))}" "${line:$(( ${#line} - 1 ))}"
done
(压缩bash代码以保存一次性变量。)
POSIX代码(第一个示例)使用参数扩展${var%...}
和${var#...}
来构造输出。 Bash代码使用${var:start:length}
表示法,arithmetic expansion,$(( ... ))
。
此答案主要用于学术目的。使用awk或sed比使用shell脚本逐行处理输入更好。
说到这个,awk解决方案可能会反映出bash解决方案:
awk '{print substr($0,1,length($0)-5) substr($0,length($0))}'
请注意,虽然bash的${var:start:length}
符号开始将字符编号为零,但awk的substr()
函数从1开始。