String 如何截断长度超过给定长度的文本行?
在x个字符数之后,您将如何删除所有内容?例如,在15个字符后剪切所有内容并添加。。。去吧 这是一个示例句,应该变成这是一个考试…您可以尝试:String 如何截断长度超过给定长度的文本行?,string,bash,shell,string-length,truncation,String,Bash,Shell,String Length,Truncation,在x个字符数之后,您将如何删除所有内容?例如,在15个字符后剪切所有内容并添加。。。去吧 这是一个示例句,应该变成这是一个考试…您可以尝试: echo 'some long string value' | sed 's/\(.\{15\}\).*/\1.../' 输出: some long strin... Awk还可以实现这一点: $ echo 'some long string value' | awk '{print substr($0, 1, 15) "..."}
echo 'some long string value' | sed 's/\(.\{15\}\).*/\1.../'
输出:
some long strin...
Awk还可以实现这一点:
$ echo 'some long string value' | awk '{print substr($0, 1, 15) "..."}'
some long strin...
在awk中,$0是当前行。substr$0、1、15从$0中提取字符1到15。尾随。。。附加三个点。GnuTools头可以使用字符而不是线条:
head-c 15使用Bash Shell扩展无需外部命令
如果您不关心shell的可移植性,那么可以在Bash中使用许多不同的。这样可以避免使用外部命令。例如:
trim () {
local str ellipsis_utf8
local -i maxlen
# use explaining variables; avoid magic numbers
str="$*"
maxlen="15"
ellipsis_utf8=$'\u2026'
# only truncate $str when longer than $maxlen
if (( "${#str}" > "$maxlen" )); then
printf "%s%s\n" "${str:0:$maxlen}" "${ellipsis_utf8}"
else
printf "%s\n" "$str"
fi
}
trim "This is an example sentence." # This is an exam…
trim "Short sentence." # Short sentence.
trim "-n Flag-like strings." # Flag-like strin…
trim "With interstitial -E flag." # With interstiti…
也可以通过这种方式循环浏览整个文件。如果文件中每行包含一个以上相同的句子,您可以按如下方式使用:
while read; do
trim "$REPLY"
done < example.txt
这种方法是否更快或更容易阅读是有争议的,但它是100%Bash,并且执行时没有fork或subshell。实际上有一个很好的答案,但是我选择稍微修改一下,使函数更好,并删除不必要的部分:p
trim() {
if (( "${#1}" > "$2" )); then
echo "${1:0:$2}$3"
else
echo "$1"
fi
}
在此版本中,较长字符串上的附加文本由第三个参数选择,最大长度由第二个参数选择,文本本身由第一个参数选择
无需变量:使用剪切:
我猜cut也是一个选项,它还处理多字节字符。这与ksh、zsh、dash和更多shell兼容,因为它不是bashim实现:trim{printf'%s'$2$1;}。如果你想要的话,只需要猛击,但要更快;您可以这样做:printf-v trimmed_string'%s'$trim$full_string在对GNU邮件列表进行了一些讨论之后,发现Bash对echo内置的选项解析有一些已知的POSIX强加的限制。具体来说,它不像大多数其他内置程序那样处理选项结束标志。因此,如果要修剪的串联参数可以以-n、-e或-e开头,那么使用printf内置是更好的选择。
echo "This is an example sentence" | cut -b1-15
This is an exam