-1

そして私はvimではなくviに慣れています。私の仕事では、現在kshとviを使用してスクリプトを作成しようとしています。私がやりたいのは、ファイルを開いてキーワードを検索し、情報を抽出できるようにすることです。たとえば、ファイルでキーワード「subject」を検索し、情報「lineone」を抽出するkshスクリプトを実行したいとします。viを使用する理由は、抽出した値をコンマで区切った1行にファイルに書き込みたいためです。

Subject: line one
Content: line two

ヘルプとリファレンスをありがとうございます。

編集:はい、sed、awk、およびgrepを使用する方がより効果的な方法です。しかし、結果をkshの変数に割り当てる際に問題が発生しました。現在、次の問題が発生しています。

testing=grep Primary /u/mtjandr/temp.txt | sed -e 's/[:a-zA-Z]* //g' 
grep Primary /u/mtjandr/temp.txt | sed -e 's/[:a-zA-Z]* //g' 

それ自体は正しい結果を出力しますが、それを変数に割り当てようとすると、エラーが発生します

copy_group.sh [18]:プライマリ:見つかりません。

更新:私は自分の解決策を見つけました:

testing=`grep Primary /u/mtjandr/temp.txt | sed -e 's/[:a-zA-Z]* //g'`
4

2 に答える 2

1

ファイルがおそらく規則的に見えることを考えると、Shawnが述べたようにawk、を調べたいと思うでしょう。興味のある行を表示し、フィールドを抽出して全体を編集します。grepsedGrepawksed

したがって、あなたの例では、以下を含む行を検索する必要がありますSubject

grep Subject file

抽出line one

awk '{printf "%s %s,", $2, $3}'

,最後に、ファイルの最後に挿入された余分なものを削除します

sed 's/,$//'

これらの3つのコマンドは、一緒にパイプする必要があります。

grep Subject file | awk '{printf "%s %s,", $2, $3}' | sed -e 's/,$//'

もちろん、awkパーツは正確なファイル構造に合わせてカスタマイズする必要があります。

最後に、すべてを(出力ではなく)別のファイルに書き込むために、上記のコマンドの出力をファイルにリダイレクトできます。

grep Subject file | awk '{printf "%s %s,", $2, $3}' | sed -e 's/,$//' > other_file
于 2012-06-01T15:33:28.573 に答える
0

上記のコメントで述べたように、そこにあるツールを使用してそれを達成するためのより簡単な方法は他にもたくさんsedありawkますgrep

実行以外のものを提供することにした場合は、次の1つのコマンドviを使用したバージョンを使用します。awk

awk '/^Subject: /{printf "%s%s",x,substr($0,10);x=","}' in.txt > out.txt

例:

[me@home]$ cat in.txt
Subject: line one
Content: line two
Subject: line three
yadda yadda

[me@home]$ awk '/^Subject: /{printf "%s%s",x,substr($0,10);x=","}' in.txt > out.txt
[me@home]$ cat out.txt
line one,line three

このx=','ビットは、最初の出力を除くすべての出力の前にコンマを付けることができるようにするためのものです。より読みやすいものにするために、出力レコード区切り文字(ORS)をから\nコンマに変更するだけです。このハウラーは、別のコマンドで削除する必要がある末尾のコンマにつながります。

この例では、出力をにパイプしてsed、末尾の区切り文字を削除します。

awk -v ORS=',' '/^Subject: /{print substr($0,10)}' in.txt | sed -e 's/,$//' > out.txt

コマンドの内訳:

awk -v ORS=',' '/^Subject: /{print substr($0,10)}' in.txt | sed -e 's/,$//' > out.txt
    _________   __________   ___________________   ______   _______________ _________
       |             |               |                |             |           |
 separate output     |          OUtput the line       |      Remove trailing    |
 records with        |           from char 10         |           comma         |
 comma (not \n)      |             onwards            |                         |  
                     |                                |                  Redirect output
             Match lines that                    input file                to out.txt
           start with "Subject :"
于 2012-06-01T15:55:45.617 に答える