Unixでは、sed 's / [^ 0-9] * / / g'コマンドはどういう意味ですか?

Unixでは、sed 's / [^ 0-9] * / / g'コマンドはどういう意味ですか?

Unixシェルスクリプトを見ていましたが、次のコマンドが見つかりました。

sed 's/[^0-9]*//g'

誰かがこれを説明できますか?

答え1

注文する

sed 's/[^0-9]//g'

数字だけを通過させるフィルタと同じです。

だからそうだろう

sed 's/[^0-9]*//g'

gしかし、最終的には*そうする必要はありません(詳細は次のとおりです)。

正規表現は[^0-9]「数字以外のすべての文字」を意味し、sedコマンドはs/[^0-9]//g「数字以外の文字をnullに変更し、各入力行でできるだけ繰り返す(つまり、数字以外の最初の文字だけでなく)を意味します。 )一行)」。

例:

$ echo '1-2 1-2? Is this mic on? Hello world! It is 2018!' | sed 's/[^0-9]//g'
12122018

命令語と同じです。

tr -dc '0-9\n'

また、入力から数字以外の文字を削除します(そして改行文字も保存します)。


[^0-9]との違いは、[^0-9]*前者は1つの数字以外の文字と一致し、後者がゼロ以上の数字以外の文字と一致することです。欲しいなら数値ではなく数値を削除、空の文字列(上記の「0個以上」の「0」)と一致することを望まないので、[^0-9]matchする方が合理的です[^0-9]*

gコマンドの最後にあるフラグはsed「グローバルに」を意味します。つまり、最初の発生だけでなく、行のすべての位置を意味します。これを削除するとわかります

$ echo '123 testing' | sed 's/[^0-9]*//'
123 testing

先行スペースと一致し、1何も置き換えません。より直感的な例:

$ echo '123 testing' | sed 's/[^0-9]*/(&)/'
()123 testing

...gついに:

$ echo '123 testing' | sed 's/[^0-9]*/(&)/g'
()1()2()3( testing)

だから私たちは

$ echo '123 testing' | sed 's/[^0-9]//'
123testing

数字ではなく空白と一致し、置き換えられます。より直感的な例:

$ echo '123 testing' | sed 's/[^0-9]/(&)/'
123( )testing

...gついに:

$ echo '123 testing' | sed 's/[^0-9]/(&)/g'
123( )(t)(e)(s)(t)(i)(n)(g)

答え2

sed 's/[^0-9]*//g'数字以外の文字を削除することを意味します。

はい

echo alsal34las | sed sed 's/[^0-9]*//g'

得る34

もっと知りたい場合は、確認してみることをお勧めします。正規表現

答え3

直接的な答え——英数字のテキストに数字が表示されるたびに検索して削除します。

説明する -

 sed 's/[^0-9]*//g' filename

次のコンポーネントで構成されます。

  1. s/search_pattern/new_pattern/options- 交換(検索と交換)
  2. [] - 正規表現。
  3. * - ワイルドカード文字が0個以上発生します。
  4. g - グローバル(1つのオプション - 行のすべての項目を置き換えます)

各コンポーネントを理解しましょう

1. sed 's/search_pattern/new_pattern/options' ファイル名

sed 's/akshat/saxena/' ファイル.txt

これは「akshat」パターンのすべての行を検索し、file.txtというファイルに最初に表示されるパターンのみを「saxena」に置き換えます。

ここでは、g(グローバル)、i(大文字と小文字を無視)などのオプションを提供できます。

 (i) g(global)
         Discussed in point 4.

 (ii)  i - searches ignoring case (case- insensitive search)
  
   sed ' s/life/love/i' file.txt

  Replace life/Life/lIfe/liFe/life/lifE (and many more) with love

2. []を用いた正規表現

正規表現では、さまざまな値の組み合わせや範囲を検索できます。

 sed 's/[Li][Ii][Ff][Ee]/love/g' file

パターンに L または l、I または i、F または f、E、または e があることを示します。したがって、大文字と小文字を区別しない検索になります。

範囲が必要な場合は、ダッシュ(-)を使用してください。 [az] は a から z までの小文字、つまりすべてのアルファベット文字を表します。 [0-9]は0〜9、つまりすべての数字を表します。

したがって、与えられたコードでは、すべての数字を検索することを意味します。

三。*

どんなキャラクターでもその場を占めることができます。したがって、与えられたコードでは、すべての文字は正規表現[0-9]に従うことができます。

4.g(グローバル)

   replace all occurrence in that line.
    
       Inorder to replace first occurence in particular line use
           

sed 'ns/akshat/$$/' ファイル

       where n is the line number. 

上記のコードは、n行の「akshat」パターンを$ $に置き換えます。

答え4

確かに、

sed 's/[^0-9]*//g

sedパイプ()の末尾に配置したり|、リダイレクト(例:<<<のように)sed 's/[^0-9]*//g' <<< 'yourstring123'したり、ファイルから直接使用する(例:sed 's/[^0-9]*//g' /your/filename

sedのコマンドはs「交換」を参照し、文字を置き換えるために使用されます。

$ sed 's/pattern/replacment/' <<< 'pattern123pattern'
replacement123pattern

g末尾の修飾子は「グローバル」を意味し、行全体を置き換えるために使用されます。

$ sed 's/pattern/replacement/g' <<< 'pattern123pattern'
replacement123replacement

[^0-9]*正規表現、これがこのコマンドの魔法です。

[: begin matching
 ^: NOT these characters:
  0-9: 0 through 9
]: end match
*: match 0 or more occurances

たとえば、[^0-9]*0 から 9 までの数字以外のすべてと一致します。

sed 's/[^0-9]*//g':数値以外のすべての文字を空の文字列( '')に置き換えます。

$ sed 's/[^0-9]*//g' <<< 'pattern123pattern'
123
$ sed 's/[^0-9]*//g' <<< '123qwertyui456opasdfghjklzxcvbnm789,./;[]=`~012+:"{}<>?345'
123456789012345

詳細についてはmansed(1)とを参照してください。regex(7)

関連情報