最初のn文字に基づいて単語を置き換える

最初のn文字に基づいて単語を置き換える

次のデータを含むファイルがあります。

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

私はこれがより簡単でより良い方法だと思います。これがあなたが探していることを願っています。

関連情報