문자열에서 일치하지 않는 토큰을 삭제하시겠습니까?

문자열에서 일치하지 않는 토큰을 삭제하시겠습니까?

(내 무지로 인해) 나에게 필요한 것을 제공하는 문자열 도구를 얻을 수 없습니다. 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 이상 정의모호한 오류가 발생합니다이므로 플래그에서 필터링해야 합니다.

즉, 두 세트의 교집합이 필요합니다.

# 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

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

관련 정보