我们想要检查这个句子是声明性的还是现在将其存储在declarative.txt
文件中,然后将其余句子放入others.txt
文件中,然后将行数放在declarative.txt
文件末尾。
如果一个句子以句号结尾,则该句子是“陈述性”的。
输入文件($1)
this life is good.
neverthe less.
suppppppppppppppppperb.
the best coders.
everything is good?
are you okay dude?
ma man !!
到目前为止我的代码
#!/bin/sh
while read row
do
x=$row | grep "\.$"
y=$row | grep -v "\.$"
echo $x >> declarative.txt
echo $y >> others .txt
done < $1
cnt=`wc -l declarative.txt`
echo $cnt >> declarative.txt
答案1
要将输入文件中的行分为以点结尾的行和不以点结尾的行,假设每行只有一个句子,并将它们保存在两个不同的输出文件中,您可以使用grep
两次,如下所示:
grep '\.$' "$1" >declarative.txt
grep -v '\.$' "$1" >others.txt
不需要在 shell 循环中遍历各行(事实上,它灰心丧气)。处理文本文件的 Unix 工具已经内置了循环,因此grep
,例如,将依次将正则表达式应用于输入数据的每一行并输出匹配的数据。
您也可以只解析一次输入文件,例如awk
:
awk '/\.$/ { print >"declarative.txt"; next }
{ print >"others.txt" }' "$1"
declarative.txt
如果当前行以点结尾,这将触发将当前行打印到文件的块。将为所有其他线路触发另一个块。
...或与sed
:
sed -n -e '/\.$/w declarative.txt' \
-e '//!w others.txt' "$1"
如果当前declarative.txt
行以点结尾,则将其写入到;others.txt
如果不是,则将其写入。空//
表达式的意思是“重新使用最后一个正则表达式”,而!
意思是“做这如果表达式不匹配”。
答案2
这是不是识别陈述句的有效方法。一方面,你的句子都没有以大写字母开头,而且很多甚至根本不是句子。但是,如果您只想将输入文件的行分成两个文件,一个包含以句号结尾的行,另一个包含其余的行,您可以使用awk
:
awk '{/\.$/ ? f="fullStop" : f="others"; print > f}' file
如果您确实需要将其作为 shell 脚本来执行,您可以简单地使用:
#!/bin/sh
awk '{/\.$/ ? f="fullStop" : f="others"; print > f}' "$1"
如果它必须是一个 shell 循环 (这不是一个好主意), 你可以做:
#!/bin/bash
while IFS= read -r line; do
[[ $line =~ \.$ ]] &&
echo "$line" >> fullStop ||
echo "$line" >> others
done < "$1"
或者,如果您无法使用 bash 特定的功能:
#!/bin/sh
while IFS= read -r line; do
printf '%s\n' "$line" | grep -q '\.$' &&
echo "$line" >> fullStop ||
echo "$line" >> others
done < "$1"