从文本文件打印所有回文

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