
_
文字、数字で構成され、二重下線なしで識別子と一致する正規表現が必要です。私の現在の試み:
^(?!_)(?!.*?_$)[a-zA-Z][a-zA-Z0-9_]+$
例:
Abdfsdfsdf__
1B2345_
v1__23456
__23456789b
12345-6789
123456789
1_fsdfdfsdf
v_fsdfsdf_fsdfd
v_123
v__123
v134234_fsdfsd
123456
a1b2c3d4e5
マッチ:
v1__23456
v_fsdfsdf_fsdfd
v_123
v__123
v134234_fsdfsd
a1b2c3d4e5
一致から行の合計を削除する方法はv1__23456
?v__123
答え1
^(?!_) # don't start with _
(?!.*?_$) # don't end with _
[a-zA-Z] # the first character must be a letter
[a-zA-Z0-9_]+$ # after that digits and underscores are ok
私は最初の文字になることができないことを2つの異なる方法で表現しましたが、_
ここではその間に何も言及されていません。__
否定的な予測を使用すると、「1つ以上の英数字または_
、orで始まらず、_
数字で終わらず、どこにも_
許可されていません」を簡単に表現できます。__
^(?![0-9_]|.*__.*_$|)[0-9A-Z_a-z]+$
負の予測なしに(awkやawkなどgrep -E
)部分を分割できます。
^[A-Za-z][0-9A-Za-z]*(_[0-9A-Za-z]+)*$
文字で始まり、0個以上の英数字があり、下線を使用できますが、各下線の後には1つ以上の英数字が続く必要があります。
答え2
これを行う方法があります。
perl -nle 'print if /(_)*.*\1/' pattern.txt
出力:
1B2345_
12345-6789
123456789
1_fsdfdfsdf
v_123
v134234_fsdfsd
123456
a1b2c3d4e5
正規表現は、/(_)*.*\1/
2つ以上の下線付きのすべての行を一致させます_
。一致しない行を印刷するには、条件を無効にするだけです。
答え3
2つの連続した下線を含まない行を探しますか?私が欠けていない場合は、次のように動作します。
grep -v '__'
または、複数の連続した下線を含む行を削除します。
grep -v '__*'
または、隣接する複数の下線を含む行を削除し、1つの下線のみを含む行を維持します。
grep -v '___*'
答え4
$ grep -E '^(_?[A-Za-z0-9])*[A-Za-z](_?[A-Za-z0-9])*$' example.txt
1_fsdfdfsdf
v_fsdfsdf_fsdfd
v_123
v134234_fsdfsd
a1b2c3d4e5