次のデータを含むファイルがあります。
ab001
ab002
ab003
ab004
「ab」で始まるすべての単語を「ab001」に置き換える必要があります。つまり、変更後のファイルは次のようになります。
ab001
ab001
ab001
ab001
%s/ab*/ab001/g
エディタで試しましたが、VI
期待した結果が出ませんでした。私もGoogleを試しましたが、解決策が見つかりませんでした。
答え1
これでマークしたから肉最初にviについて質問をしましたが、viでなぜ動作しないのか、どのように解決するのかを説明します。最初に次のことを試したと言われました。
%s/ab*/ab001/g
検索は、以前の*
原子を0回以上、できるだけ一致させるように機能します。から:h /*
:
*/star* */\star*
* (use \* when 'magic' is not set)
Matches 0 or more of the preceding atom, as many as possible.
この場合、前の原子は「b」なので、この検索は次のいずれかと一致します。
a
ab
abbb
abbbbbbbbbbbbbbbbbbb
また、一致しますab001
が、最初の部分のみが一致するため、一致はです(ab)001
。 Viはあなたがこれを探していることを発見し、それを(ab001)001
。解決策は簡単です。あなたは一致したいです
「ab」の後に何も出てこない
ドット文字(.
)は、改行文字を除くすべての文字と一致します。だから検索してみると
/ab.*/
一致する何もない「ab」で始めてください。だからあなたは以下が欲しい:
:%s/ab.*/ab001/g
一致するものが多すぎる場合(たとえば、「絶対に」などの単語など)、数字だけを見つけるように単純化できます。たとえば、「ab」の後にランダムな数字が続く場合と一致します。
/ab\d*/
これは、「ab」の後に3桁の数字が続くものと一致します。
/ab\d\{3}/
ブックマークをお勧めします。このページクイックvi-regexを参照してください。特定の正規表現の問題を解決するのに非常に役立つことがわかりました。
答え2
awk
以下を使用してこれを実行できます。
cat input_file | awk '{if($1~/^ab/){print "ab001"}else{print $0}}'
最初のフィールドが「ab」で始まる場合、ファイルは検索され、そのawk
文字を使用して「ab001」に置き換えられます。これは選択されたフィールドを^
意味します。そうしないと、レコードはそのまま印刷されます。start of
答え3
Perl onelinerを試してみましょう。
perl -i.bak -pe 's/\bab.*?\b/ab001/g;' [file(s)]
単語境界で「ab」で始まるすべての要素を見つけて「ab001」に置き換える正規表現
私はこのファイルを作成しました:ab001
ab002
ab003
ab004
ab005 ac001
ad0032 ab006
このPerlスクリプトは、次の出力を生成しました。
ab001
ab001
ab001
ab001
ab001 ac001
ad0032 ab001
私はこれがあなたが望むものだと思います。
私が使用した他のオプションは、リンクのPerlドキュメントで最もよく説明されています。perlrun - Perlインタプリタを実行する方法
答え4
試してみましたか?
$ sed 's/ab\(.\+\)/ab001/g' -i file.txt
または
$ sed 's/\(^ab\).*/ab001/g' -i file.txt
私はこれがより簡単でより良い方法だと思います。これがあなたが探していることを願っています。