GNU/Linux >> Linux の 問題 >  >> Linux

Bashでサブストリングを別のストリングに置き換える

これがシナリオです。大きな弦があり、その一部を別の弦に置き換えたいと考えています。

たとえば、「今日行を書いています」を変更するとします。 "から"私は行を書いています "。

このクイックチュートリアルでは、Bashでネイティブにサブストリングを置き換える方法を紹介します。拡張機能としてsedコマンドの例も示します。

サブストリングをbashでネイティブに置き換えます(1行に適しています)

Bashには、文字列操作のための組み込みメソッドがいくつかあります。文字列の一部を別の文字列に置き換えたい場合は、次のようにします。

${main_string/search_term/replace_term}

「今日は行を書いています」という行で構成される文字列変数を引用符なしで作成し、todayを置き換えます。 now

[email protected]:~$ line="I am writing a line today"
[email protected]:~$ echo "${line/today/now}"
I am writing a line now

何が起こったのか理解しましたか?構文"${line/today/now}" 、lineは、文全体を格納した変数の名前です。ここでは、最初のオカレンスを置き換えるように指示しています。 todayという言葉の now 。したがって、元の変数の内容を表示する代わりに、変更された単語の行が表示されます。

したがって、line 変数は実際には変更されていません。それはまだ同じです:

[email protected]:~$ echo $line
I am writing a line today

ただし、必要な単語を確実に置き換えて、同じ変数を変更して、変更を永続的にすることができます。

[email protected]:~$ line="${line/today/now}"
[email protected]:~$ echo $line
I am writing a line now

これで変更が永続的になり、文字列内で最初に出現する部分文字列を永続的に置き換えることができます。

他の変数を使用して、置換する特定の部分文字列を格納することもできます。

[email protected]:~$ replace="now"
[email protected]:~$ replacewith="today"
[email protected]:~$ line="${line/${replace}/${replacewith}}"
[email protected]:~$ echo $line
I am writing a line today

ここでは、置換する単語をreplaceという変数に格納しました。 そして、それがreplacewith内で置き換えられるという単語 。その後、上記と同じ方法で行を「修正」しました。これで、このチュートリアルの最初に行った変更が元に戻されました。

別の例を見てみましょう:

[email protected]:~$ hbday="Happy Birthday! Many Many Happy Returns!"
[email protected]:~$ hbday="${hbday/Many/So Many}"
[email protected]:~$ echo $hbday
Happy Birthday! So Many Many Happy Returns!
サブストリングのすべての出現箇所を置き換える

文字列内の複数の部分文字列を置き換えることもできます。別の例で見てみましょう:

[email protected]:~$ hbday="${hbday//Many/So Many}"
[email protected]:~$ echo $hbday
Happy Birthday! So Many So Many Happy Returns!

その余分な/ hbdayの後 Manyのすべての出現箇所を置き換えました So Many 文の中。

sedコマンドを使用して文字列を置き換えます(ファイルでも機能します)

bashの文字列内のサブ文字列を置き換える別の方法を次に示します。この方法でsedコマンドを使用します:

最初の出現を置き換える:

line=$(sed "s/$replace/s//$replacewith/" <<< "$line")

最初の例をとると、次のように再生できます。

gを追加して、すべてのオカレンスを置き換えることもできます 最後に:

line=$(sed "s/$replace/$replacewith/g" <<< "$line")

さて、これはネイティブのbash文字列メソッドよりも複雑だと思うかもしれません。おそらく、しかしsedは非常に強力であり、sedを使用して、ファイル内の文字列のすべての出現箇所を置き換えることができます。

sed -i 's/$replace/$replacewith/' filename

タイトルに「殺人」が含まれているアガサ・クリスティの本の例を次に示します。

[email protected]:~$ cat agatha.txt 
The Murder in the Vicarage
Murder in Mesopotamia
Murder is Easy
Murder on the Orient Express
Murder In Retrospect

両方が同じだと考える人もいるので、殺人を結婚に置き換えます:

sed -i "s/Murder/Marriage/g" agatha.txt

変更されたファイルは次のとおりです:

The Marriage in the Vicarage
Marriage in Mesopotamia
Marriage is Easy
Marriage on the Orient Express
Marriage In Retrospect

Sedは、Linuxでテキストファイルを編集するための非常に強力なツールです。少なくともその基本を学ぶ必要があります。

この記事を読んで楽しかったですか?文字列の置き換えやこの記事について何か共有したいことがあれば、下のコメントでそうしてください。


Linux
  1. 文字列をSedのスラッシュを含む文字列に置き換える方法は?

  2. bashで単語を別の単語に置き換える

  3. Bash:タイムアウトで待機

  1. tr コマンド - 文字列 \n を実際の改行 (\n) に置き換える方法

  2. sedで一重引用符を別の文字に置き換えるにはどうすればよいですか?

  3. bash - 部分文字列の文字列インデックス位置を見つける

  1. Bash -cと位置パラメータ?

  2. 文字列にBashの部分文字列が含まれているかどうかを確認する方法

  3. 行番号によって、あるファイルの行を別のファイルの行に置き換えます