私はUNIX(bash)に初めて触れ、この言語を習得しようとしてきました。現在、.txtファイルに固定ヘッダーを持つテーブルを作成しようとしています。
だから私は次のようなコードを見つけました:
column -t -s : <(echo Name:Age:Gender:Height:Weight) test.txt | sed "1{p;s/./*/g}"
sed
最後に、コマンド部分は完全に混乱しています。私はすべてを取り替える./*/g
手段sed
と世界中で起こり得る手段を知っています。.
*
/g
しかし、the1
とtheはp;s
実際に何を意味しますか?
答え1
これは非常に賢いコードです。
sed,この素晴らしいチュートリアルで学ぶことができるように、適用可能住所そして注文する。 アドレスを省略すると、commonなどの各行でコマンドが実行されますs/old/new/
。
アドレスは行番号または正規表現です。または、カンマ区切りのアドレス範囲にすることもできます。これについてはもう説明しません。 (詳しくは上記のチュートリアルをご覧ください。)
コマンドは単一のコマンドでも、中括弧で囲まれた複数のコマンドでもかまいません。
この sed コマンドはp
rint コマンドを実行します。それからs
行1に代替コマンドを入力します。その結果、入力の最初の行の後に同じ長さの文字列が表示されます***
。
このs
コマンドの後にはrintコマンドは表示されませんが、そのオプションが最初にsedに渡されない限り、各行の終わりにp
「パターンスペース」のすべての内容が暗黙的に印刷されます。-n
(詳しくは上記のチュートリアルをご覧ください。)
本質的に、これはテーブルに美しいタイトルを作成する簡単な方法です。
コメントに返信するには、次を編集してください。
したがって、この
p
コマンドは1sedの先頭のどこにでも配置できますor at the end? Also, the
。 `(ピリオド)は住所が省略されたことを意味しますか?
いいえ、正確ではありません。
つまり1
、次のコマンドのリスト(中括弧で囲まれている)は、入力の最初の行にのみ適用されます。
これp
が意味するのは、パターン空間の現在の内容と改行文字を印刷することです。 (この時点では、パターン空間には入力の最初の行が含まれています。これはSedの仕組みだからです。)
これは、正規表現(すべての文字と一致)のすべての一致(グローバル)s/./*/g
に対して文字が置き換えられることを意味します。これはパターン空間で動作します。g
.
*
その後、コマンドの終わり(閉じ括弧)にコマンドがなくなり、パターンスペースの内容が暗黙的に印刷されます。この時点にはアスタリスク(***
)のみが含まれています。
次に、入力の次の行をパターン空間に読み込みます。アドレスが1
一致しないため、中括弧コマンドブロックをスキップします。中かっこブロックの末尾にはもはや命令がないので、パターン空間の内容は暗黙的に印刷される。入力がある限り、このセクションを繰り返します。したがって、結果は、最初の行以降の残りの入力が変更されずに印刷されることです。
したがって、出力には入力のすべての行と文字のみが含まれ、最初の行と同じ長さの最初の行の後の行が*
含まれます。
答え2
*
sedスクリプトは入力の最初の行を印刷し、最初の行とまったく同じ幅の文字行を印刷します。
1{p;s/./*/g}
1
入力の最初の行にのみ一致するアドレス。つまり、ブロックsed
のコマンドは{}
最初の行にのみ適用されます。p
- 入力内容を変更せずに印刷;
コマンド区切り記号。この場合、p
コマンドとs/./*/g
コマンドを区別します。s/./*/g
- 各文字をaに変更し*
て結果を印刷します。
sed
残りの入力(ライン2+)がある場合(対応する-n
オプションなしで使用されている場合)、デフォルトの動作に応じて
完全なコマンドは次のとおりです。
column -t -s : <(echo Name:Age:Gender:Height:Weight) test.txt | sed "1{p;s/./*/g}"
column -t -s :
エコー文字列と"Name:Age:Gender:Height:Weight"
の内容で構成される入力を設定するために使用されますfile.txt
。 column
出力はパイプで接続され、sed
s ラインを生成し、******
ヘッダーを残りの出力から分離します。