파일의 특정 버전 번호(또는 개정 번호)를 일치시키는 가장 좋은 방법은 무엇입니까
몇 가지 선택을 했지만 다른 최선의 방법이 있다고 생각합니다(예: Perl one-liner)
version=23.092.12
cat generic_version | grep "$version"
cat generic_version | grep -F "$version"
cat generic_version | awk -v ver=$version '/ver/'
일반 버전 - 많은 부동 버전을 포함하는 파일입니다.
예
cat /tmp/generic_version | ......
예상 결과:
23.092.12 # version approve
파일 예
23.087.23 # version approve
23.092.12 # version approve
23.098.45 # version approve
23.099.12 # version under testing
답변1
최소한 23.092.123 또는 1.23.092.12와 같은 일치를 피하기 위해 숫자 앞이나 뒤에 점 없이 일치시키는 것이 좋습니다 (물론 , , .. $version
도 고려해 볼 수도 있음 ). 더 쉬울 수도 있습니다 .23.092.12-rc1
23.092.12b
23.092.12-2
perl
<generic_version V=$version perl -ne 'print if m{(?<![\d.])\Q$ENV{V}\E(?![\d.])}'
성냥:
xxx 23.092.12 yyy
xxx23.092.12yyy
23.092.12-pre1
하지만 위에는 없어
23.092.12.2
23.092.123
123.092.12
23.092.12.
및 각각 역방향 탐색 및 정규식 연산자입니다. 환경 변수의 내용이 정규 표현식이 아닌 고정 문자열로 처리되도록 사용합니다(따라서 (?<!...)
문자 일치라는 특별한 의미를 잃습니다).(?!...)
\Q...\E
.
편집 내용에 따라 입력 파일의 버전 번호가 항상 줄의 시작 부분에 있고 항상 공백 문자가 뒤에 오는 경우 이를 다음과 같이 단순화할 수 있습니다.
<generic_version V=$version perl -ne 'print if m{^\Q$ENV{V}\E\s}'
또는 awk
첫 번째 필드가 버전인 행을 일치시키려면 다음을 수행하십시오.
<generic_version V=$version awk '$1 "" == ENVIRON["V"]'
""
문자열 비교를 강제하기 위해 연결이 수행됩니다 . 그것 없이는 좋아요를 누르면 $version
일치 123.4
할 것입니다 123.40
.
$version
입력에서 공백으로 구분된 필드를 일치시키려면 다음을 수행하십시오 .
<generic_version V=$version perl -ne 'print if m{(?<!\S)^\Q$ENV{V}\E(?!\S)}'
전제는 $version
앞뒤에 공백이 아닌 문자( )가 없다는 것입니다 \S
.
답변2
Awk
해결 방법(입력 파일 형식에 따라 다름):
version="23.092.12"
awk -v ver="$version" '$1 == ver' /tmp/generic_version
산출:
23.092.12 # version approve
답변3
파일의 generic_version
줄당 버전 번호가 포함되어 있고 $version
다음 줄 중 하나와 정확히 일치할 수 있다고 가정합니다.
grep -xF "$version" generic_version
이 -F
플래그를 사용하면 grep
패턴이 정규식이 아닌 고정 문자열로 해석되는 동시에 -x
일치 항목이 전체 줄에 걸쳐 적용됩니다(정규식 패턴에서 및 가 사용된 것처럼 ^
).$
문제의 파일 형식을 공개한 후:
awk -v v="$version" '$1 == v' generic_version
version
그러면 공백으로 구분된 첫 번째 열이 변수 값과 동일한 파일의 모든 줄이 출력됩니다 .