从文本文件打印所有回文

时间:2017-10-30 12:10:49

标签: bash palindrome

我看了这个问题: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;

我知道这是从“单词”中读取,但在尝试修改它以从文本文件而不是/usr/share/dict/words中读取时遇到问题。我想让它读取我要求的任何文本文件,所以我可以把:

source palindrome *filename*

这将打印出控制台中文件中找到的回文。后来还有它,所以我可以输出到输出文件:

source palindrome *filename* >> output.txt

我试过这样做,但它不起作用,我真的不确定我要改变它来阅读我的文件:

#!usr/bin/bash

function search
{
    filename=$1

    grep -E '^[a-z]{3,45}$' "$filename" | while read -r word;
        do [ $word == `echo $word | rev` ] && echo $word;
    done;
}
search $1

如果给出任何解决方案,它们的格式是否相似?我还没有学到太多其他技术。如果给出更复杂的解决方案,您可以稍微解释一下代码。

输入文件来自电子书,它非常长,所以一个小片段是:(我确实知道这不会在片段中展示回文,但它只是显示它是什么样的文本文件)< / p>

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 时,没有错误消息。我按回车键,终端让我再输入我想要的东西。它看起来不像是在运行脚本

3 个答案:

答案 0 :(得分:2)

#!/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

答案 1 :(得分:1)

你的shebang线错了。变化:

#!usr/bin/bash

#!/usr/bin/bash

#!/bin/bash

答案 2 :(得分:0)

这个(没有脚本):

comm -12 <(nl foo) <(rev foo | nl) | cut -f2