sed または awk を使用して、パターンの後ろの内容をすべて削除します。

sed または awk を使用して、パターンの後ろの内容をすべて削除します。

私はそれについて多くの質問があることを知っていますが、それを動作させることはできません。

グループ(例:)を使用または削除したいですroot。だから後ですべて削除する必要があります。/etc/groupsedawkroot:*:0:

私は以下を使用してそれを削除しようとしました。

cat /etc/group | awk '!p;/^root:*:0:/{p=1}'

そして

cat /etc/group | sed 's/root\:\*\:0\:.*//'

ただし、sedroot全体を削除してください。

私は何が間違っていましたか?

答え1

sedでアドレスを使用して、作業する行を制限できます。

 sed '/^root:/s/:[^:]*$/:/' /etc/group

で始まる行の場合、行root:の最後の文字以降のすべての文字が削除されます:

/etc/groupレコードには:4つの区切り列しかないため、最後の列とその中のすべてのグループメンバーが削除されます。)

答え2

そしてawk

awk 'BEGIN{OFS=FS=":"} $1=="root"{$NF=""} 1' /etc/group

フィールドを分割し、:最初のフィールドがある場合は、最後のフィールドを空の文字列に設定しますroot

答え3

これが実際に単純なテキスト処理ツールを使用して行われるべきかどうかに関する質問とは別に、sed「replace」コマンドが次のものを置き換えるため、呼び出すと行全体が消去されます。全体代替パターンを見つけます(あなたの場合は空の文字列)。

ライン操作のための最小限の修正sedは次のとおりです。

sed 's/root:\*:0:.*/root:*:0:/' /etc/group

または、キャプチャグループを使用します。

sed 's/\(root:\*:0:\).*/\1/' /etc/group

(ただし、catファイルをコマンドライン引数として提供または使用する場合は必要ありません。)sedawk

しかし、@Shawnによって提案された解決策はこれに関してよりエレガントです。

関連情報