1行に「#」が1つだけあるすべての行をgrepしたいと思います。
例:
xxx#aaa#iiiii
xxxxxxxxx#aaa
#xxx#bbb#111#yy
xxxxxxxxxxxxxxxx#
xxx#x
#x#v#e#
この出力を提供する必要があります
xxxxxxxxx#aaa
xxxxxxxxxxxxxxxx#
xxx#x
答え1
努力する
grep '^[^#]*#[^#]*$' file
どこ
^ ; begin of line
[^#]* ; any number of char ≠ #
# ; #
[^#]* ; any number of char ≠ #
$ ; end of line
提案したようにライン全体をgrepすることができます。
grep -x '[^#]*#[^#]*'
そして
- ラインアンカーの開始/終了がない同じパターンです。
-x
行全体をgrepするには、次を参照してください。man grep
-x, --line-regexp Select only those matches that exactly match the whole line. For a regular expression pattern, this is like parenthesizing the pattern and then surrounding it with ^ and $.
答え2
使用awk
:
awk -F'#' 'NF==2' infile
フィールド区切り文字に基づいて#
1行のフィールド数が正確に2つのフィールドの場合に印刷されます。たとえば、#x
またはx#
さらに#
は2つのフィールドとして扱われます。
答え3
2回の呼び出しgrep
:1つ以上の行を選択し、#
2つ以上の行を削除します。
grep '#' filename | grep -v '#.*#'
答え4
awk
条件付きブロックでgsub関数を使用して行を選択できます。
$ awk 'gsub(/#/, "#") == 1' file
$ awk '/#/ && ! /#.*#/' file
$ sed -ne 's/#/&/2;t' -e '//p' file
- sedコマンドとオプションのため、少なくとも2行は
#
印刷されません。t
-n
- これにより、行に正確に1つの#またはなしが残ります。 // を使用して電子を印刷します。
perl
行を検出するために、スカラーコンテキストの文字数を計算できます。#
$ perl -ne 'print if tr/#/#/ == 1' file