文字列から一致しないトークンを削除しますか?

文字列から一致しないトークンを削除しますか?

(私の無知のために)私に必要なものを提供する文字列ツールを取得することはできません。 CPU パフォーマンスに基づく文字列があります。この文字列はさまざまなプロセッサがさまざまな機能を提供するので、さまざまです。:

# Example from a modern Core i5 4th gen
SUNCC_CXXFLAGS="-D__SSE2__ -D__SSE3__ -D__SSSE3__ -D__SSE4_1__ -D__SSE4_2__ -D__AES__ -D__PCLMUL__ __AVX__ ..."

この文字列は、Sun Studio 12.3以降に最適です。 ~のためSun Studio 12.2以前では、SSE2、SSE3、SSSE3、SSE4.1、およびSSE4.2のみを使用できます。。 AES異常の定義あいまいなエラーが発生しますしたがって、フラグでフィルタリングする必要があります。

言い換えれば、2組の交差集合が必要である。

# Cannot use AES and above for SunCC 12.2
ALLOWED_CXXFLAGS="-D__SSE2__ -D__SSE3__ -D__SSSE3__ -D__SSE4_1__ -D__SSE4_2__"
# New processor, needs to be filtered due to old compiler
SUNCC_CXXFLAGS="-D__SSE2__ -D__SSE3__ -D__SSSE3__ -D__SSE4_1__ -D__SSE4_2__ -D__AES__ -D__PCLMUL__ __AVX__ ..."

多くの質問と回答を読んだ。awkは正規表現と行と一致します(一致しません)。。ただし、単一行のタグに基づいてフィルタリングする必要があります。

以下を試しましたが、期待した結果は出ませんでした。

$ echo "-D__SSE2__ -D__SSE3__ -D__SSSE3__ -D__SSE4_1__ -D__SSE4_2__ -D__AES__ -D__PCLMUL__" | \
  nawk '!/(-D__SSE2__|-D__SSE3__|-D__SSSE3__)/'
$

別の変更点:これはSolarisなので、これらのツールにはGNUツールには多くのオプションがありません。これが私がsedやgrepの代わりにawkを試した理由の1つです。

私のタグセットと一致しないタグをどのようにフィルタリングしますか?

ベストアンサー1

SSEフラグのみを選択するには、以下を試してください。

awk '/SSE/' ORS=' ' RS=' '

ここで重要なのは、入出力レコード区切り文字を空白に設定することです。このようにして、各オプションは個別に承認または拒否されます。

たとえば、

$ SUNCC_CXXFLAGS="-D__SSE2__ -D__SSE3__ -D__SSSE3__ -D__SSE4_1__ -D__SSE4_2__ -D__AES__ -D__PCLMUL__ ..."
$ newFLAGS="$(echo "$SUNCC_CXXFLAGS" | awk '/SSE/' ORS=' ' RS=' ')"
$ echo "$newFLAGS"
-D__SSE2__ -D__SSE3__ -D__SSSE3__ -D__SSE4_1__ -D__SSE4_2__ 

SSEここでの試合は十分に近いようです。そうでない場合は、より具体的に説明できます。

$ newFLAGS="$(echo "$SUNCC_CXXFLAGS" | awk '/^-D__(SSE2|SSE3|SSSE3|SSE4.1|SSE4.2)__/' ORS=' ' RS=' ')"
$ echo "$newFLAGS"
-D__SSE2__ -D__SSE3__ -D__SSSE3__ -D__SSE4_1__ -D__SSE4_2__ 

代替案:SSEとAESを除く

$ echo "$SUNCC_CXXFLAGS" | nawk '!/SSE|AES/' ORS=' ' RS=' '
-D__PCLMUL__ ...

一致オプションを保持SSE または sse

$ SUNCC_CXXFLAGS="-D__SSE2__ -D__SSE3__ -D__SSSE3__ -D__SSE4_1__ -D__SSE4_2__ -D__AES__ -D__PCLMUL__ -xarch=sse3"
$ newFLAGS="$(echo "$SUNCC_CXXFLAGS" | awk '/SSE|sse/' ORS=' ' RS=' ')"
$ echo "$newFLAGS"
-D__SSE2__ -D__SSE3__ -D__SSSE3__ -D__SSE4_1__ -D__SSE4_2__ -xarch=sse3

ここで変更されたのは、正規表現/SSE/をで置き換えるということです/SSE|sse/。縦棒は論理ORを表しているため、OR|と一致します。SSEsse

おすすめ記事