30

trUNIXシェルでコマンドを使用して特定の文字列を削除することは可能ですか?例:次のように入力した場合:

tr -d "1."

入力は1.1231、出力として表示23されますが、表示したいのです1231(最初のものだけ1がなくなっていることに注意してください)。どうすればいいですか?

解決策やより良い方法を知っている場合は、コピー&ペーストだけでなく学習したいので、構文を説明してください。

私はawkに大きな問題を抱えているので、これを使用する場合は、さらに詳しく説明してください。

4

5 に答える 5

17

上記の例では、cutコマンドで十分です。

例:echo '1.1231' | cut -d '.' -f 2を返し1231ます。

カットの詳細については、と入力するだけですman cut

于 2012-04-23T14:39:24.760 に答える
13

ある種の正規表現(おそらくsedのようなもの)を使用したほうがよいでしょう。

たとえば、入力1.1231では、次を使用して1231出力を取得できます。

sed 's/1\.//g'

たぶんここを見てください:http: //tldp.org/LDP/abs/html/string-manipulation.html

于 2012-04-23T14:39:31.937 に答える
8

この種のことにはsedを使用することもできます。

$ echo "1.1231" | sed -e "s/1\.//"
1231

これは、sedを使用して正規表現の検索と置換を実行し、「1」を置き換えています。(適切なエスケープを使用して)""を使用します。デフォルトでは、最初の一致のみが削除されます。

于 2012-04-23T14:33:29.987 に答える
5

を使用している場合は、パラメータ置換bashを使用してこれを簡単に行うことができます。

$ a=1.1231
$ echo ${a#1.}
1231

これにより、先頭 の文字列が削除され"1."ます。最初のオカレンスまでを削除する場合はを使用し、最後のオカレンス${a#*1.}までを含むすべてを削除する場合はを使用します。${##*1.}

文字列操作に関するTLDPページには、さらにオプション(部分文字列抽出など)があります。

このような単純な変換に標準shの組み込み文字列操作ツールを使用すると、などの外部ツールを使用するよりも常にはるかに高速になることに注意してくださいsedawkまたはcut、シェルが操作を実行するためにサブプロセスを作成する必要がないためです。ただし、より複雑な場合(たとえば、正規表現を使用する必要がある場合や入力が大きい場合)は、専用のツールを使用することをお勧めします。

于 2012-04-23T14:34:08.813 に答える
2

あなたが具体的にについて尋ねたのでawk、ここにもう一つあります。

awk '{ gsub(/1\./,"") }1' input.txt

awkチュートリアルでわかるように、プログラムの一般的な形式は「awk条件{アクション}」のシーケンスです。アクションがない場合、デフォルトのアクションは印刷です。条件がない場合、アクションは無条件に実行されます。このプログラムは、これらの特殊なケースの両方を使用します。

最初の部分は条件のないアクションです。つまり、すべての行に対して実行されます。アクションは、正規表現のすべての出現箇所/1\./を何も置き換えないことです。したがって、これにより「1」がトリミングされます。(コンテキストに関係なく)行から。

2番目の部分は、アクションのない条件です。つまり、条件がtrueの場合に出力され、条件は常にtrueです。これは、「完了しました。現在の内容をすべて印刷する」の一般的なイディオムです。これは単純に定数で構成されます1(条件として使用される場合、単純に「真」を意味します)。

これは、いくつかの方法で再定式化することができます。たとえば、印刷を最初のアクションに組み込むことができます。

awk '{ gsub(/1\./,""); print }'  input.txt

おそらく、整数部分、つまりピリオド記号の前の任意の数値に置き換えたいと思うでしょう。その正規表現は次のようになります/[0-9]+\./

gsubはGNU拡張機能であるため、レガシー構文subへの移植性が必要な場合は、またはある種のループに置き換えることをお勧めします。awk

于 2012-04-23T15:36:39.037 に答える