したがって、次の種類のランダムWebサイトのリストがあります。
rapido21655bonk.a.sweetpotato.net
rapido26230bonk.a.sourpotato.net
rapido29926bonk.b.sourpotato.net
rapido29926bonk.b.sweetpotato.net
rapido30179bonk.a.sweetpotato.net
rapido30648bonk.b.sourpotato.net
rapido30761bonk.c.sweetpotato.net
数字だけを保持し、他のすべてを削除するにはsed文字列が必要です。私がしたことは最初の部分を削除することです。 2番目の部分では、sedを2回使用して削除できますが、いくつかのロジックを使用して1つのsedで削除できるsed s/rapido//
かどうかを知りたいと思います。or
私はsedを使用してa or b or c
usingを一致させることができることを知っていますが、[abc]
単語全体に一致するものと似ていることを望みます。だから私が次にしたことは次のとおりです。
sed s/rapido//|sed s/bonk.[abc].sweetpotato.net//
その後、Sourpotato.netを使用して別のものを追加しましたが、次のことはできません。
sed s/rapido//|sed s/bonk.[abc].(sweet|sour)potato.net//
これはうまくいきません。それは私にこれを与えます:(
-bash: syntax error near unexpected token
''
rapido22452boonkers.red
時には私がそこに保管したいものと同じものを得ることができるので、番号を変更するだけでは機能しません。 2つの選択肢を削除したいです。sweetpotato.net
OR。sourpotato.net
[111@111 ~]$ sed s/rapido// sedster|sed 's/bonk.[abc].(sweetpotato|sourpotato).net//'
21655bonk.a.sweetpotato.net
26230bonk.a.sourpotato.net
29926bonk.b.sourpotato.net
29926bonk.b.sweetpotato.net
30179bonk.a.sweetpotato.net
30648bonk.b.sourpotato.net
30761bonk.c.sweetpotato.net
答え1
数値のみを抽出するには、GNUを使用して次のことを実行できますgrep
。
$ grep -oP '\d+' file
21655
26230
29926
29926
30179
30648
30761
または移植のためにPerlを使用してください。
$ perl -pe 's/[^\d\n]+//g' file
21655
26230
29926
29926
30179
30648
30761
またはsed
:
$ sed -nE 's/[^0-9]+//gp' file
21655
26230
29926
29926
30179
30648
30761
より具体的な入力データが必要な場合は、次のことを試すことができます。
$ sed -nE 's/.*rapido([0-9]+)bonk\..\.(sweet|sour)potato.net.*/\1/p' file
21655
26230
29926
29926
30179
30648
30761
答え2
そして
sed -r 's/([^0-9]*)([0-9]*)([^0-9]*)/\2/g'
中央の数字だけを維持してください。これは拡張正規表現でのみ機能するため、を-r
選択する必要がありますsed
。
実は一度だけ使っても十分です。
sed -r 's/([^0-9]*)([0-9]*)(.*)/\2/g'
\1
これは、式の一部を...として引用する機能を使用し、引用したい式部分の周りに括弧を使用する必要が\2
あります。(...)
上記のコードでは、2番目の部分は真ん中の([0-9]*)
数字と一致し、と参照できます\2
。
編集する:terdonが指摘したように、最初の部分は再利用されないので、キャプチャする必要はありません。だから
sed -n -r 's/[^0-9]*([0-9]+).*/\1/p'
十分。
通常、上記のコマンドは最初行に数字を入力してください。
答え3
あなたの試み
sed s/rapido// | sed s/bonk.[abc](sweet|sour)potato.net//
実際にはかなり似ていますが、2つの間違いを犯しました。まず、コマンドを引用符で囲んでいないため、bash
特殊文字「(」と「|」が解釈されています。
2番目のエラーはより微妙です。Sed
そしてgrep
使用基本的な数文字だけを使用した正規表現(。 *^$[])には特別な意味があります。使いたいなら拡大する正規表現演算子(| (){})の前にバックスラッシュを付ける必要があります。したがって、コマンドは次のようにする必要があります。
sed < t 's/rapido//' | sed 's/bonk.[abc].\(sweet\|sour\)potato.net//'
sed
1回の実行で複数のコマンドを処理できるため、次のように単純化できます。
sed < t 's/rapido//; s/bonk.[abc].\(sweet\|sour\)potato.net//'
答え4
数字以外のすべてを削除するにはtr
解決策は次のとおりです。
x='21655bonk.a.sweetpotato.net
26230bonk.a.sourpotato.net
29926bonk.b.sourpotato.net
29926bonk.b.sweetpotato.net
30179bonk.a.sweetpotato.net
30648bonk.b.sourpotato.net
30761bonk.c.sweetpotato.net'
printf '%s\n' "$x" | tr -d '[:alpha:].'
21655 26230 29926 29926 30179 30648 30761
または
printf '%s\n' "$x" | tr -cd '0-9 '