Bash 将一系列句子改成单行句子

Bash changing a series of senteces and making them into single line ones

我想做的是从包含一系列句子的文本文件加载,并创建一个包含每个句子的数组作为单独的索引,并带有一些可能的 grep 条件,例如包含一个字符串。 这就是我得到的。它在数组中的原因是因为我希望它稍后计算行数,但是如果它在数组中我可以用简单的循环来做,所以我想保持这种状态

#!/bin/bash
location=$(pwd)
file="${location}/text"
cat $file

string=$(cat $file |sed 's/./.*/g' | tr '*' '\n' |sed 's/?/?*/g' | tr '*' '\n' |sed 's/!/!*/g' | tr '*' '\n')

在这部分我打开了一个文件,根据我的理解我替换了一个 .用 .* 而不是用 \n 替换 * 并用 ?! 做同样的事情。所以现在我应该有一个字符串,其中包含用新行分隔的每个句子

echo $string

array=( $($string | grep "hello" | grep "!") )

echo $array

现在应该将字符串放入数组中,条件是有一个单词hello,并且是一个命令句。但问题是:

echo $string
otuput : . . . . . . . . . . . . etc...

还有创建数组的那一行说 .: .: 是一个目录...下面所有代码都没有分开

#!/bin/bash
location=$(pwd)
file="${location}/text"
cat $file

string=$(cat $file |sed 's/./.*/g' | tr '*' '\n' |sed 's/?/?*/g' | tr '*' '\n' |sed 's/!/!*/g' | tr '*' '\n')

echo $string

array=( $($string | grep "hello" | grep "!") )

echo $array

示例文本

Text text hello! hello? text text.
text text. text hello! text?
hello! text text.

预期产出:

echo $string : 
Text text hello!
 hello?
 text text.
text text.
 text hello!
 text?
hello!
 text text.

基本上每行一个句子(是的,有时开头有空格,但没关系),因为 string=$(cat $file |sed 's/././g' | tr '' '\ n' |sed 's/?/?/g' | tr '' '\n' |sed 's/!/!/g' | tr '' '\n') 应该这样做 但 echo $string 的当前输出:

Text text hello! hello? text text. text text. text hello! text? hello! text text.

至于 echo $array

basically the same as $string but each line as separate index in array 

但当前输出看起来与 $string 相同,将其打印为一个字符串而不是换行中的每个句子

请将它保持在简单的水平,我只是盯着 bash 并创建了这个脚本来学习和娱乐,我知道有一些不可思议的人在使用它,但据我所见,它可以得到接力疯狂快速 :)

关于 echo $string - 请阅读 https://mywiki.wooledge.org/Quotes and why-is-printf-better-than-echo

这是你想要做的吗?

$ string=$(sed 's/\([[:punct:]]\) /\n/g' file)
$ printf '%s\n' "$string"
Text text hello!
hello?
text text.
text text.
text hello!
text?
hello!
text text.

$ readarray -t -d$'\n' array < <(sed 's/\([[:punct:]]\) /\n/g' file)
$ printf '%s\n' "${array[@]}"
Text text hello!
hello?
text text.
text text.
text hello!
text?
hello!
text text.
$ declare -p array
declare -a array=([0]="Text text hello!" [1]="hello?" [2]="text text." [3]="text text." [4]="text hello!" [5]="text?" [6]="hello!" [7]="text text.")

$ string=$(sed 's/\([[:punct:]]\) /\n/g' file | grep 'hello!')
$ printf '%s\n' "$string"
Text text hello!
text hello!
hello!

如果您的 sed 版本不支持 \n 替换,则将其更改为以下任一版本:

sed 's/\([[:punct:]]\) /\'$'\n''/g' file

sed 's/\([[:punct:]]\) /\
/g' file

如果它不支持字符 类 则 获取一个新的 sed 但否则将 [[:punct:]] 更改为 [!?.] 并列出所有括号表达式内的标点符号或将其更改为 [^][ \ta-zA-Z0-9_-] 并列出您不希望在括号表达式内被视为标点符号的所有字符。