sedでAWORDまたはBWORDをCWORDに置き換えます。

sedでAWORDまたはBWORDをCWORDに置き換えます。

したがって、次の種類のランダム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 cusingを一致させることができることを知っていますが、[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.netOR。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//'

sed1回の実行で複数のコマンドを処理できるため、次のように単純化できます。

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 ' 

関連情報