なぜ `sed expr1 | sed expr2`は `sed -e expr1 -e expr2`とは異なります


10

出力を分割しidて、ユーザーがメンバーであるグループのより読みやすいリストごとのリストを提供していました。

id roaima | sed 's/,/\n\t/g'
uid=1001(roaima) gid=1001(roaima) groups=1001(roaima)
    24(cdrom)
    25(floppy)
    ...
    822413650 (international (uk) location)

グループ番号を括弧で囲まれた名前から分離したかったので、このように式を拡張しました

id roaima | sed -e 's/,/\n\t/g' -e '2,$s/(/ (/'

しかし、これは当初期待したようには機能しませんでした。2番目の式は効果がないようです。

代わりに、必要な結果を得るにはsed、次のように2つの個別のコマンドを実行する必要がありました。

id roaima | sed -e 's/,/\n\t/g' | sed '2,$s/(/ (/'
uid=1001(roaima) gid=1001(roaima) groups=1001(roaima)
    24 (cdrom)
    25 (floppy)
    ...
    822413650 (international (uk) location)

sed複数の命令を持つ1 つのコマンドではなく、なぜパイプ内に2つのコマンドが必要なのですか?または、これを1つsedで実行できる場合、どうすればよいですか?

私が特に望むのは、すべての単一のアイテム(最初の行のUIDとGIDを含む)のUID / GID値と括弧で囲まれた名前の間に単一のスペースを置くことですが、注意点は、実際のデータにグループを含めることができることです名前に角かっこが含まれていて、名前自体を壊したくない。

回答:


14

sedawkまたはor cutまたはlikeはperl -ne、各行で次々に個別に機能します。

sed -e code1 -e code2

実際には次のように実行されます:

while(patternspace = getline()) {
  linenumber++
  code1
  code2
} continue {print patternspace}

code2がの場合2,$ s/foo/bar/、それは次のとおりです。

if (linenumber >= 2) sub(/foo/, "bar", patternspace)

入力には1行しかsub()ないため、実行されません。

のパターンスペースに改行文字を挿入しcode1ても、linenumber増加しません。

代わりに、入力の最初の唯一の行を処理するときに、複数の行を含む1つのパターンスペースがあります。2行目以降の複数行のパターンスペースを変更する場合は、次のようにする必要があります。

s/\(\n[^(]*\)(/\1 (/g

もちろん、ここでは、2つの操作を一度に実行することもできます。

id | sed 's/,\([^(]*\)(/\n\t\1 (/g'

awk、およびperl -n / pは、デフォルトで行になりますが変更できる各レコードで機能します。この場合-vRS=,または-054助けることができます。
dave_thompson_085 2017

5

あなたがGNU sedを持っているなら、あなたは使うことができます

id username | sed 's/(/ (/4g; s/,/\n\t/g'

4番目以降の左括弧の前にスペースを追加し、コンマを置き換えます。


1
おもしろそうです。残念ながら、私の例のようinternational (uk) locationに、名前自体に不要なスペースを挿入することにより、角かっこを含むグループ名にも影響します。
ロアイマ

次にs/\([[:digit:]]\+\)(/\1 (/4g、かっこの前に数字がある場合にのみスペースを追加するwhichを使用します。
グレンジャックマン

1

@stéphane-chazelasが言ったことは真実ですが、いつでも最初にスペースを追加し、次のように行に分割できます。

sed -e 's:\([,=][0-9]*\):\1 :g' -e 's:,:\n\t:g'

または、単一のsedスクリプトで(なし-e):

sed 's:\([,=][0-9]*\):\1 :g; s:,:\n\t:g'

通常/、コマンド検索の区切り文字として「」を使用しますが、任意の文字を受け入れます。そのため、:/\」のような組み合わせを避けるために、「」のような他の文字を使用して読みやすくなる場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.