だから私はこれらのすべてのユーザーログイン(service、admin、J009878)を持っていて、ここに表示されているこのテーブルは他のコマンドからのもので、その出力は私がfile.txtに保存したこのテーブルです。私が達成したいのは、file.txtファイル(テーブルがある場所)を見つけて、ログイン情報と一致するIDを抽出できることです。ログイン情報(J009878、admin、またはそのいずれかである可能性があります)は$ user変数の形式で提供され、その変数と一致するIDを抽出するために使用する必要があります。
たとえば、私の変数ユーザーがログインまたはID J665454を取得した場合、そこからID 23を抽出できるようにしたいと思います。同様に、ログイン名がadminの場合は、ID 4を抽出して変数に保存する必要があります。
どんな助けでも大変感謝します。ありがとうございます!
答え1
$person
ログイン名が保存されていると仮定すると、次のGNU sedコマンドを使用してこれを達成できます。
sed -En "s_\s*\|([0-9]+)\s*\|\s*$person\s*\|.+_\1_p"
例:
❯ set person Jack
❯ cat table.txt | sed -En "s_\s*\|([0-9]+)\s*\|\s*$person\s*\|.+_\1_p"
4
❯ set person David
❯ sed -En "s_\s*\|([0-9]+)\s*\|\s*$person\s*\|.+_\1_p" table.txt # also works
32
説明する:
sed -E -n
: -E は拡張正規表現フラグを設定し、 -n は明示的に指示しない限り sed が印刷しないようにします。
s_<regex>_<replacement>_p
:s
は代替コマンドです(_
どんな文字でも可能です。_
読みやすくするために選択しました)。正規表現と一致して代替式に置き換えます。最後のものはp
それを印刷し、私たちが使用したので-n
一致する行だけを印刷します。
\s*\|([0-9]+)\s*\|\s*$person\s*\|.+
: 式の正規表現部分で、次のように記述されます。
正規表現 | 重要性 |
---|---|
\s*\| |
これは任意の数のスペース(テーブルがスペースで始まる場合)と一致し、次にリテラルと一致します| 。正規表現では特別な意味を持つ| ので脱出します。| |
([0-9]+) |
これは0から9の範囲の1つ以上の文字と一致します。ほとんどの正規表現エンジンでは\d この機能を使用できますが、サポートされていませsed ん\d 。式の周りの括弧は、置換で参照するために使用できる「グループ」に入れます\1-9 。たとえば、echo "hello" | sed "s_([aeiou])/\1\1_g" will generate はheelloo 各コレクションが2つのコピーに置き換えられるためです(gフラグを使用すると、1行に複数回動作します)。 |
\s*\|\s* |
任意のスペース(スペースなしを含む)、テキスト、| 任意のスペース(スペースなしを含む)の順です。 |
$person |
この部分はシェルに置き換えられ、sedはこれを見ることができないため、スクリプトが呼び出されると一致するJack 文字またはその他の項目で終わります。$person |
\s*\| |
必要な数のスペース(スペースなしを含む)とtextを一致させて、探しているログインが一致しないことを確認する必要があります| 。Jackie Jack |
.+ |
これは行末までのすべての項目と一致します。交換を実行すると、一致しないすべてのアイテムがまだ印刷されるため、行全体が一致することを確認する必要があるため、これは重要です。 |
\1
:正規表現が一致するもの(全体を減らしてください)を、私たちが探しているID番号のグループ1に置き換えます。これにより、行全体がそのID番号のみを保持するため、その行が印刷されます。