Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如何截断长度超过给定长度的文本行?_String_Bash_Shell_String Length_Truncation - Fatal编程技术网

String 如何截断长度超过给定长度的文本行?

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) "..."}

在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) "..."}'
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