(내 무지로 인해) 나에게 필요한 것을 제공하는 문자열 도구를 얻을 수 없습니다. 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 |
과 일치합니다 .SSE
sse