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_-]
并列出您不希望在括号表达式内被视为标点符号的所有字符。
我想做的是从包含一系列句子的文本文件加载,并创建一个包含每个句子的数组作为单独的索引,并带有一些可能的 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_-]
并列出您不希望在括号表达式内被视为标点符号的所有字符。