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
次のコンポーネントで構成されます。
s/search_pattern/new_pattern/options
- 交換(検索と交換)[]
- 正規表現。*
- ワイルドカード文字が0個以上発生します。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)