1

このUnix全体にとって非常に新しいものです。私は現在、korn シェルを使用して、いくつかの行のテキストをフォーマットしようとしています。

私の入力には、次のような行がいくつかあります

Date/Time        :- Monday June 03 00:00:00 EDT 2013
Host Name        :- HostNameHere
PIDS             :- NumbersNLetters
Product Name     :- ProductName

望ましい出力は次のようになります。

Date/Time="Monday June 03 00:00:00 EDT 2013" HostName="HostNameHere" PIDS="NumbersNLetters" ProductName="ProductName"

そのため、一番左の列のスペースをすべて取り除き、すべてを右端の列に引用符で挟む必要があります。私はカットコマンドを見て、ここまで来ました:

Cut -f 1,2 -d -

のような結果が得られる可能性がありますがDate/Time:Monday June 03 00:00:00 EDT 2013、これは私が望むものに近いですが、完全ではありません。cut で括弧を追加できるかどうかはわかりませんでした。また、そのようにスペースを削除できるようにも見えません。

sed答えに近いようですが、特定のパターンではなく任意のパターンを検索する方法をグーグルで見つけることができませんでした。信じられないほど基本的な質問で申し訳ありませんが、ドキュメンテーションを読んでも、頭が痛くなり始める前にしか手が届きません...もっと良いリソースがある場合は、正しい方向に向けていただければ幸いです。ありがとう!

4

6 に答える 6

3

片道awk:

awk '{
    gsub(/[[:space:]]+/,"",$1);
    gsub(/.*/,"\"&\"",$2);
    print $1,$2
}
END { print "\n" }' FS=':- ' OFS='\=' ORS=' ' inputFile

またはワンライナー

awk '{gsub(/ /,"",$1);print $1,q$2q}END{print "\n"}' OFS='\=' q='"' FS=' +:- ' ORS=' ' file
于 2013-06-28T21:57:49.060 に答える
2

基本的に、入力に 3 つの異なる変換を適用します。

  1. すべての行で、 の前の空白をすべて削除します:-
  2. :-すべての行で、その後に続く空白をに置き換え="ます。
  3. すべての行で"、末尾に追加します。
  4. 改行をスペースに置き換えます。

適切なコマンドを考え出す前に、このような計画を作成することをお勧めします。

最初のステップを実行するには、 を使用sedするのが最適なオプションです。sed正規表現で動作します。これについては、Regular-Expressions.infoで読むことができます。式がその周囲を認識する必要がある前に、空白を削除したいだけだからです。:-この目的のために、ゼロ幅の lookbehnd assertionを使用して、パターン (空白、 で示される\s) が行の後に何も置換しないことを確認することができ:-ます。ただしsed、正規表現のこの機能はサポートされていないため、代わりに perl ワンライナーを使用します。

perl -pe 's/\s*(?=.*:-)//g'

これは次のことを意味します: 任意の数の文字の後に続く空白を空の文字列に置き換え:-ます。はグローバルgを表し、パターンは最初の一致だけでなく、すべての一致を置換します。in の使用は と同じですが、より洗練された正規表現を使用できます。perl -pesed

ステップ 2はもう少し単純です。:-プラスの空白を に置き換え=ます。

sed 's/:-\s*/="/'

ステップ 3は非常に簡単です。

sed 's/$/"/'

ここで、は行末を$意味します。ちなみに、区切り文字として使用して、2 つ以上のコマンドを 1 つに組み合わせることができます。sed;

sed 's/:-\s*/="/;s/$/"/'

これにより、わずかに速くなります。最後のステップにもを使用するように言うことはできますsedが、この機会に別のコア コマンドを紹介します: . translateの略で、任意の 1 文字を別の文字に置き換えます。sed よりもはるかに高速です。trtr

tr '\n' ' '

ここで、\nは改行文字 (ASCII コード0x0a) を表します。

したがって、すべてのピースをまとめると、次のようになります。

cat input | perl -pe 's/\s*(?=.*:-)//g' | sed 's/:-\s*/="/;s/$/"/' | tr '\n' ' '

sedさらに詳しく調べるために、およびのマニュアル ページを読むことをお勧めしますtr。これを行うには、次のコマンドを入力します。

man sed
man tr
于 2013-06-28T22:08:49.577 に答える
2

あなたはあなたを始めるためにこのようなことをすることができます

awk '{
  if (NR % 4)
printf("%s ", $0)
  else
printf("%s\n", $0)
}' file

ここにあります http://www.unix.com/shell-programming-scripting/115070-how-can-i-join-three-lines-into-one-unix.html

次にカットを使用します

于 2013-06-28T21:34:19.910 に答える