1

クロスワードの解決に役立つ bash スクリプトを作成しようとしています。たとえば、質問は「ドイツ語でアルコール飲料」です。最初の場所に「B」があり、最後の場所に「R」があり、その間に 2 つのギャップがあります。したがって、正規表現は $B..R^ になります。私はスイスに住んでいるので、ngerman 辞書 (DICT=/usr/share/dict/ngerman) を使用したいと思います。シェルで直接行う方法は次のとおりです。

    grep -i '^B...$' /usr/share/dict/ngerman

これは完璧に機能し、「Bier」という単語が他の 3 つの単語の中に表示されます。この構文は扱いにくいので、次のように入力できる小さなバッチ スクリプトを書きたいと思います。

    crosswords 'B..R'

これが私のアプローチです:

#!/bin/bash

DICT=/usr/share/dict/ngerman

usage () {
    progname=$(basename $0)
    echo "usage: $progname regex"
}

if [ $# -le 0 ]; then 
    usage
    exit 1
fi

regex="'^$1$'"
cmd="grep -i $regex $DICT"
echo $regex
echo $cmd
$($cmd) | while read word; do
    echo "$word"
done

しかし、何も表示されず、機能しません。デバッグの理由から$regex、変数と変数も出力します。$cmd出てくるものは次のとおりです。

'^B..R$'

grep -i '^B..R$' /usr/share/dict/ngerman

それがまさに私が必要としているものです。上記のコマンドをコピーして貼り付けると、完全に機能します。しかし、で呼び出すと$($cmd)失敗します。なにが問題ですか?

4

3 に答える 3

0

ああ、今、私はそれを手に入れました。手動で行うと、「」が展開されます!これが私の C でのテスト プログラム (param-test.c) です。

#include <stdio.h>
int main(int argc, char *argv[]) {
    puts(argv[1]);
    return 0;
}

次に、次のように呼び出します。

    param-test 'foo'

そして私は見る:

    foo

それが問題です!grep は実際には 'B..R' を取得しませんが、B..R. のみを取得します。

于 2013-09-07T14:56:54.710 に答える