从文本文件打印所有回文
Printing all palindromes from text file
我看了这个问题:BASH Palindrome Checker。这是该线程的问题答案显示的内容:
grep -E '^[a-z]{3,45}$' /usr/share/dict/words | while read -r word;
do [ $word == `echo $word | rev` ] && echo $word;
done;
我知道这是从 "words" 读取的,但在尝试修改它以从文本文件而不是 /usr/share/dict/words
读取时遇到了问题。我想让它读取我请求的任何文本文件,所以我可以输入:
source palindrome *filename*
这将在控制台打印出在文件中找到的回文。稍后还要拥有它,以便我可以输出到输出文件:
source palindrome *filename* >> output.txt
我已经尝试这样做,但它不起作用,我真的不确定我必须更改什么才能让它读取我的文件:
#!usr/bin/bash
function search
{
filename=
grep -E '^[a-z]{3,45}$' "$filename" | while read -r word;
do [ $word == `echo $word | rev` ] && echo $word;
done;
}
search
如果给出任何解决方案,它们可以采用类似的格式吗?我还没有学到太多其他技术。如果给出更复杂的解决方案,你能解释一下给出的代码吗?
输入文件来自一本电子书,它非常长,所以一个小片段是:(我意识到这并没有在片段中显示回文,但它只是为了显示它是什么类型的文本文件)
O and that lotion mustn't forget.
Fever near her mouth. Your head it simply. Hair braided over: shell with
seaweed. Why do they hide their ears with seaweed hair?
当运行source palindrome filename时没有错误提示。我按下回车键,终端让我再次输入任何我想输入的内容。通过脚本看起来不像是运行
你的 shebang 行是错误的。变化:
#!usr/bin/bash
至
#!/usr/bin/bash
或
#!/bin/bash
#!/bin/bash
function search
{
grep -oiE '[a-z]{3,}' "$@" | tr '[:upper:]' '[:lower:]' | while read -r word; do
[[ $word == $(rev <<< "$word") ]] && echo "$word"
done
}
search "$@"
编写此原始代码的词典每行都有一个小写单词。要解析每行包含多个大小写混合单词的文本文件,您需要进行一些修改:
- 从正则表达式中删除
^
和 $
锚点以查找一行中任意位置的单词。
- 使用
grep -o
打印出匹配的词。
- 使用
grep -i
来匹配大小写。
- 使用
tr
将大写字母转换为小写字母。
其他修复:
- 将 shebang 行更改为
#!/bin/bash
。它应该是绝对路径,两种首选形式是 #!/bin/bash
或 #!/usr/bin/env bash
.
- 已将
£word
更改为 $word
。
- 使用
"$@"
这样 search()
可以接受多个文件名。
改进:
- 没有特别的理由将单词限制在 45 个字符以内。
{3,}
删除上限。
- 双括号
[[ ]]
是better than single brackets[ ]
.
$(cmd)
优于 `cmd`
.
rev <<< "$word"
优于 echo "$word" | rev
.
这个怎么样(没有脚本):
comm -12 <(nl foo) <(rev foo | nl) | cut -f2
我看了这个问题:BASH Palindrome Checker。这是该线程的问题答案显示的内容:
grep -E '^[a-z]{3,45}$' /usr/share/dict/words | while read -r word;
do [ $word == `echo $word | rev` ] && echo $word;
done;
我知道这是从 "words" 读取的,但在尝试修改它以从文本文件而不是 /usr/share/dict/words
读取时遇到了问题。我想让它读取我请求的任何文本文件,所以我可以输入:
source palindrome *filename*
这将在控制台打印出在文件中找到的回文。稍后还要拥有它,以便我可以输出到输出文件:
source palindrome *filename* >> output.txt
我已经尝试这样做,但它不起作用,我真的不确定我必须更改什么才能让它读取我的文件:
#!usr/bin/bash
function search
{
filename=
grep -E '^[a-z]{3,45}$' "$filename" | while read -r word;
do [ $word == `echo $word | rev` ] && echo $word;
done;
}
search
如果给出任何解决方案,它们可以采用类似的格式吗?我还没有学到太多其他技术。如果给出更复杂的解决方案,你能解释一下给出的代码吗?
输入文件来自一本电子书,它非常长,所以一个小片段是:(我意识到这并没有在片段中显示回文,但它只是为了显示它是什么类型的文本文件)
O and that lotion mustn't forget.
Fever near her mouth. Your head it simply. Hair braided over: shell with
seaweed. Why do they hide their ears with seaweed hair?
当运行source palindrome filename时没有错误提示。我按下回车键,终端让我再次输入任何我想输入的内容。通过脚本看起来不像是运行
你的 shebang 行是错误的。变化:
#!usr/bin/bash
至
#!/usr/bin/bash
或
#!/bin/bash
#!/bin/bash
function search
{
grep -oiE '[a-z]{3,}' "$@" | tr '[:upper:]' '[:lower:]' | while read -r word; do
[[ $word == $(rev <<< "$word") ]] && echo "$word"
done
}
search "$@"
编写此原始代码的词典每行都有一个小写单词。要解析每行包含多个大小写混合单词的文本文件,您需要进行一些修改:
- 从正则表达式中删除
^
和$
锚点以查找一行中任意位置的单词。 - 使用
grep -o
打印出匹配的词。 - 使用
grep -i
来匹配大小写。 - 使用
tr
将大写字母转换为小写字母。
其他修复:
- 将 shebang 行更改为
#!/bin/bash
。它应该是绝对路径,两种首选形式是#!/bin/bash
或#!/usr/bin/env bash
. - 已将
£word
更改为$word
。 - 使用
"$@"
这样search()
可以接受多个文件名。
改进:
- 没有特别的理由将单词限制在 45 个字符以内。
{3,}
删除上限。 - 双括号
[[ ]]
是better than single brackets[ ]
. $(cmd)
优于`cmd`
.rev <<< "$word"
优于echo "$word" | rev
.
这个怎么样(没有脚本):
comm -12 <(nl foo) <(rev foo | nl) | cut -f2