ファイルにさらに端末を追加したいです/etc/securetty
。具体的には、まだ存在しない場合は範囲内にあるpts/n
ものを追加したいと思います。コマンドでこれを達成できますか?私の内容は次のとおりです。n
0-9
sed
/etc/securetty
# Local X displays (allows empty passwords with pam_unix's nullok_secure)
pts/0
pts/1
pts/2
pts/3
私は同様のことを試しました:
sudo sed '+pts/3+a pts/4' /etc/securetty
これにより、次のエラーが発生します。
sed: -e expression #1, char 3: extra characters after command
答え1
その行に出会ったら、分数/数字を書き留めます。この-p
オプションはautoprint
機能します。到着したら、eof
ハッシュを抽出し%h
、フィルタを通過してgrep
印刷されていない端末を確認し、map
それを使用してフォーマットを準備します。
perl -lpe 'm|^pts/([0-9])$| and $h{$1}++;
END{ print for map { "pts/$_" } grep { !$h{$_} } 0 .. 9; }
' /etc/securetty
hold space
数字0 1 2 ... 9に初期化します。この行に会うたびにpts/[0-9]
予約されたスペースから切り取られます。でeof
予約されたスペースを取得し、数字が見つかったら、正しい形式に変更して印刷する必要があります。
sed -e '
# initialize the hold space with 0 1 ... 9
1{x;s|.*|'"$(echo {0..9})"'|;x}
# whatever be the line, it needs to be printed
p
# we meet a valid pts/ line
\|^pts/[0-9]$|{
# the hold space gets appended to the pattern space
G
# grab what is the pts number and search for it in the hold and
# delete itand store back the changes into hold space.
s|^pts/\([0-9]\)\n\(.*\)\1 |\2|;h
}
# weve not arrived at the eof and weve processed the input so go no further
$!d
# we are at the eof, so we bring back the hold space. just in case all
# numbers were dealt with up, we simply bail out. Else, prepend the str
# pts/ to the numbers present and simply were home
g;/[0-9]/!d;s/ //g
s|[0-9]|pts/&\n|g;s/.$//
# *TIP*: Sprinkle the l, list pattern space at various places to see
# whats going on.
' /etc/securetty
答え2
欠落している場合は、1行を追加するには各項目を削除して最後に追加します。
sed -n '/pattern/!p;$a pattern'
しかし、同じパターンを10回繰り返すのは良いことではありません。
sed '/pts\/[0-9]/d;$a pts/0 ...
最後の行を削除すると失敗します。したがって、反対方向に作業すると、最初の行が次に始まる唯一の行であると想定されます#
。
sed '/#/a pts/0\
pts/1\
pts/2\
pts/3\
pts/4\
pts/5\
pts/6\
pts/7\
pts/8\
pts\9
/pts\/[0-9]/d'
くそー。この場合は、他のツールを使用することをお勧めします。
答え3
一部/すべてのpts/N
行を削除し、すべて再追加します。
{ grep -xv '^pts/[0-9]$' /etc/securetty; printf 'pts/%d\n' {0..9}; } > /etc/securetty.new
cat /etc/securetty.new
mv /etc/securetty.new /etc/securetty
お気に入りのテキスト処理ツールを使用して、これを一度に実行することもできます。ed
ed -s /etc/securetty <<IN
g/^pts\/[0-9]$/d
.r ! printf pts/\%d\\\n {0..9}
,p
q
IN
(内部編集,p
で置き換え)またはw
sed
{ printf '%s\\\n' '$a' pts/{0..8}
printf '%s\n' 'pts/9' '/^pts\/[0-9]$/d'
} | sed -f- /etc/securetty
これは一般とほぼ似ています。
sed '$a\
pts/0\
pts/1\
pts/2\
pts/3\
pts/4\
pts/5\
pts/6\
pts/7\
pts/8\
pts/9
/^pts\/[0-9]$/d' /etc/securetty
(使用sed
そして-i
その場でファイルを編集)
答え4
sed
ファイルを1行ずつ処理すると、複数行の情報を「記憶」することが困難になります。
grep
を使用すると、ファイルに特定のパターンが含まれていることを確認でき、-f
同時に複数のパターンを提供できます。以下はリスト全体を生成pts/0
しpts/9
、指定されたファイルにすでに存在するパターンを削除し、残りのパターンをファイルに追加します。
#!/bin/bash
printf 'pts/%d\n' {0..9} \
| grep -vFf "$1" - >> "$1".new
mv "$1".new "$1"