3

目標:テキストファイルのフォルダーをループするために、行末、単語でラップされた、ハイフンでつながれた単語をすべて抽出し、それらをリストにまとめます。

001.txt be-littled
001.txt dev-eloper
002.txt sand-wich
...

目的は、リストをスキャンして、有効なハイフンでつながれた単語を単に単語でラップされた単語と区別することです(つまり、24対dev-eloper)。

私の現在のBash/sedスクリプトは、ほとんどの(十分な)単語を正しくキャッチします。(ハイフンでつながれた単語が段落を終了するときのように)微調整が必​​要なことはわかっています。

しかし、現在、現在のファイル名をパターンスペースに入れることができません。

for f in *.txt
  do
    sed -rn 'N;/PATTERN/!{D};s:PATTERN:\3-\5\n\7:;P;D' * > output.txt;
  done

..where PATTERN =(^。)(+)(。+)(-\ n)(\ S +)(+)(。 $)

また

for f in *.txt; do sed -rn 'N;/(^.*)( +)(.+)(-\n)(\S+)( +)(.*$)/!{D};s:(^.*)( +)(.+)(-\n)(\S+)( +)(.*$):\3-\5\n\7:;P;D' * > output.txt;done

\3の直前に'"$f"'を入れてみましたが、すべての行の最後のページが先頭に追加されています(つまり、 '250.txt be-littled')。

私のコードは、私が思っていることを正確に実行していないのではないかと思います。:-)たぶん私はbash内のsedのループ順序を理解していません。

私はUbuntu12.10を使用していて、数週間前にbashとsedの学習を始めました。私は提案を受け入れています。

ありがとう、

4

3 に答える 3

1

私はあなたが何を意味するのか全くわかりませんがword-wrapped、これはうまくいくかもしれません:

grep -oH "[^ ]*-[^ ]*$" *.txt | sed 's/:/ /'

末尾のsed呼び出しは、出力を自分のものと等しくすることです。最初:に追加さgrepれたものを空白で置き換えます。

出力:

$ cat 001.txt 
be-littled
dev-eloper

$ cat 002.txt 
sand-wich

$ grep -oH "[^ ]*-[^ ]*$" *.txt | sed 's/:/ /'
001.txt be-littled
001.txt dev-eloper
002.txt sand-wich

:で使用される表現を改善してgrep、ニーズに合わせて調整するには、最初に要件を学習する必要があります。実際、私はそのアイデアを理解していませんでしたword-wrapped

于 2013-03-02T17:21:50.877 に答える
1

なぜファイル名を書き込めなかったのか正確にはわかりません。あなたは'"$f"'以前に試したことを書いた\3、私はそれがうまくいくはずだと思う。'"..."'ただし、ほぼ同じことを行いましたが、代わりにsed-command全体に二重引用符を使用しているため、構文を使用する必要はありません。また、結果ファイルに書き込むときの代わりにを
使用する必要があります。そうしないと、ループ内の新しいファイルごとに結果ファイルが上書きされます。 タイプミスの可能性もありますが、sed行の最後にあるのは私が思う代わりにすべきです。>>>
... * > output.txt$f*

sedコマンドに二重引用符を使用し、inの後にスペースを入れ、ファイル!名を書き込むための置換で使用します(結果で使用できるように、置換区切り文字としても使用します)。! {D}>> output.txt$f@<file>:

for f in *.txt; do
  sed -rn "N;/(^.*)( +)(.+)(-\n)(\S+)( +)(.*$)/! {D};s@(^.*)( +)(.+)(-\n)(\S+)( +)(.*$)@$f: \3-\5\n\7@;P;D" $f >> output.txt
done

私はあなたのパターンをレビューしていませんが、私がそれをテストしたとき、それはとてもうまくいくようです。

2つの小さなファイルで試してみました。1つは質問にラップされた単語が含まれ、もう1つは「ダミーの単語」が含まれる行が含まれています。

[]$ cat tf1.txt
asdf asdf be-
littled asdf asdf
asfd dev-
eloper asdf sand-
wich asdf asdf.
[]$ cat tf2.txt
asfd abc-
de lsdk laskfjd
asdf asdf 1234-
56 sdl sdg
sdfg

出力:

[]$ ./tfwordwrap.sh
tf1.txt: be-littled
tf1.txt: dev-eloper
tf1.txt: sand-wich
tf2.txt: abc-de
tf2.txt: 1234-56
于 2013-03-02T19:30:20.760 に答える
0

sedで現在のファイル名を取得する方法がわかりません。perlを使用してもかまわない場合は、代わりにこのperlスクリプトを試してください。

use strict;
use warnings;

my $hyphen;

while (<>) {
    next if (m/^\s*$/);

    if ($hyphen) {
        m/^\s*(\w+)/;
        print "$1\n";
        $hyphen = 0;
    }

    if (m/(\w+-)\s*$/) {
        print "$ARGV $1";
        $hyphen = 1;
    }
}

このスクリプトは、行の最後のハイフンでつながれた部分をファイル名と一緒に出力し、フラグを設定します。次の行で、このフラグを探し、その行の最初の単語を出力します。また、空の行をスキップします。

あなたはそれを次のように呼びます

perl hyphen.pl file1.txt file2.txt ...
于 2013-03-02T16:39:46.583 に答える