2

私はバッチファイルを分析していますが、テキストファイルを編集し(入力)、txtファイルを作成する(出力)という行があります。

バッチは、3 つの補助 tools.exe: grepsedおよびを使用していcutます。マニュアルの使い方を読んでみましたが、簡単ではありませんでした。

行は次のとおりです。

type input.txt | sed "s#""#'#g" | grep -o "class='name[^>]*" | sed -n "/id=/p" | grep -o "surname=[^>]*" | cut -d"'" -f2 >output.txt

行がどのように解釈されるか知りたいですか? ルールは何ですか?これを行うためのよりスマートな方法はありますか (たとえば、3 つすべてではなく 1 つのツールを使用するなど)?

4

3 に答える 3

4

あなたが尋ねたことのほとんどをカバーしていますが、jebの答えに追加します。
これら 3 つのコマンドは、Linux から移植されたエミュレートされたコマンドであり、次のことを行います。

  1. sed: テキストをフィルタリングおよび変換するためのストリーム エディター。
  2. grep: パターンに一致する線を印刷するためのツール。
  3. cut: ファイルの各行の選択した部分を切り取るためのツール。

man <command name>Linux で入力するか、同じ文字列 (たとえば、「man grep 」) をグーグルで検索して、これら 3 つのコマンドの詳細を読むことをお勧めします。
また、正規表現を調べてください。初心者にとっては通常不明確ですが、パターンを表現するための一般的でコンパクトな方法です。

質問の特定の使用法について:

sed "s#""#'#g"

行ごとに、引用符 ( "") がアポストロフィ ( ') に置き換えられます。

grep -o "class='name[^>]*"

これは、 で始まる行の一部のみを出力しclass='nameますが、次の行はありません>

sed -n "/id=/p"

デフォルトでは、Sed はすべての行を出力します。一方、sed -n "<some pattern> /p"指定されたパターンに一致する行のみを印刷します。この場合、Sed は を含む行のみを出力しid=ます。

grep -o "surname=[^>]*"

これは、 で始まる行の一部のみを出力しますsurname=name'が、次の行はありません>

cut -d"'" -f2

これにより、各行がアポストロフィ ( ') で区切られた連続するフィールドとして解析され、2 番目のフィールドが選択されます。

すべてがパイプ処理されます。つまり、各コマンドの出力は、右側の次のコマンドの入力として機能します。「input.txt」の内容は Sed コマンドに渡され、その出力は grep コマンドに渡されます。最終的な出力は、明らかに「output.txt」という名前の新しいファイルに出力されます。

はい、jeb が述べたように、これは厄介なソリューションのように見えsedます。

于 2012-06-20T15:04:43.070 に答える
2

多かれ少なかれ簡単です。

それを単一のコマンドに分割します:

sed "s#""#'#g"各引用符を文字sed "s/""/'/g"に置き換えます'

grep -o "class='name[^>]*"テキストのある行のみをキャッチしclass='name-oスイッチは出力の前にプレフィックスを付ける必要がありますSTDIN:(これが役立つ理由はわかりません)。

sed -n "/id=/p"text を含む行のみをキャッチしますid=

grep -o "surname=[^>]*"text を含む行のみをキャッチしますsurname=

cut -d"'" -f2行をパーツに分割します。パーツは ( ) で区切られ'-d'2 番目のフィールド ( -f2) が得られます。

はい、これは高速なハック ソリューションのように見えます。これは sed だけで解決できます。
特に、単一のテキストの順序が次のように固定されている場合:
<class="name17" id=13> <surname=Frank>

于 2012-06-20T14:58:13.857 に答える
0

| 文字はパイプ文字です。これは、あるコマンドの出力を別のコマンドの入力にパイプするために使用されます。

>文字はリダイレクト文字です。標準出力をファイルにリダイレクトします。

したがって、この例では、プロセスはtypeコマンドで始まります。

type input.txt

これにより、 input.txtが標準出力に送信され、次のコマンドの入力にパイプされます。

sed "s#""#'#g"

以下同様に、他のパイプされたgrepおよびsedコマンドを使用します。

最後のcutコマンドは、>文字を使用して、出力をoutput.txtファイルにリダイレクトします。

cut -d"'" -f2 >output.txt
于 2012-06-20T12:13:40.667 に答える