Mar*_*ick 15
这将截断字符串,砍掉额外的三个字符,如果长度比您作为参数提供的值长,则添加“...”。
other_programs | \
awk -v len=40 '{ if (length($0) > len) print substr($0, 1, len-3) "..."; else print; }'
Run Code Online (Sandbox Code Playgroud)
尝试这个:
awk -F '' '{if (NF > 70) {print substr($0, 0, 71)"..."} else print $0}'
Run Code Online (Sandbox Code Playgroud)
如果NF太高,更简单的方法:
awk '{if (length($0) > 70) {print substr($0, 0, 71)"..."} else print $0}'
Run Code Online (Sandbox Code Playgroud)
或更短的版本:
awk 'length > 70{$0=substr($0,0,71)"..."}1'
Run Code Online (Sandbox Code Playgroud)
一些可能性:
与 sed
sed -E 's/(.{N})(.{1,})$/\1.../' file
Run Code Online (Sandbox Code Playgroud)使用 perl 稍微优雅一点(使用lookbehind)
perl -pe 's/(?<=.{N}).{1,}$/.../' file
Run Code Online (Sandbox Code Playgroud)whereN是您希望用省略号替换的字符数。
awk正如其他答案中所介绍的,sed、 、 和perl,擅长文本处理,并且可能是完成这项工作的最佳工具。
但如果您愿意,您也可以纯粹地执行此操作bash(即“不离开外壳”):
n=70
while read -r; do
if ((${#REPLY}<=n))
then printf '%s\n' "$REPLY"
else printf '%s...\n' "${REPLY:0:$((n-3))}"
fi
done < filenameRun Code Online (Sandbox Code Playgroud)
替换70为所需的最大长度和filename输入文件。
要在管道的右侧使用它(即,将另一个命令的输出通过管道传输到它),请删除并预先设置或将整个内容包含在:< filenamen{ ... ;}
{ n=70
while read -r; do
if ((${#REPLY}<=n))
then printf '%s\n' "$REPLY"
else printf '%s...\n' "${REPLY:0:$((n-3))}"
fi
done ;}Run Code Online (Sandbox Code Playgroud)
(这个括号括起来的版本在其他上下文中也可以正常工作,包括上面的重定向。在该用例中括号是不必要的,但没有害处。)
这看起来像:
ek@Ilex:~$ help read | head -5 | { n=70
> while read -r; do
> if ((${#REPLY}<=n))
> then printf '%s\n' "$REPLY"
> else printf '%s...\n' "${REPLY:0:$((n-3))}"
> fi
> done ;}
read: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N n...
Read a line from the standard input and split it into fields.
Reads a single line from the standard input, or from file descr...
if the -u option is supplied. The line is split into fields as...
Run Code Online (Sandbox Code Playgroud)
请注意,与迄今为止提出的其他解决方案一样,在存在显示超过一列宽度的字符(例如水平制表符)的情况下,这将无法完美地限制输出宽度。