그래서 저는 이러한 모든 사용자 로그인(service, admin, J009878)을 가지고 있고 여기에 보이는 이 테이블은 다른 명령에서 나온 것이고 그 출력은 제가 file.txt에 저장한 이 테이블입니다. 내가 달성하고 싶은 것은 file.txt 파일(테이블이 있는 위치)을 찾아 로그인 정보와 일치하는 ID를 추출할 수 있는 것입니다. 로그인 정보(J009878, admin 또는 그 중 하나일 수 있음)는 $user 변수의 형태로 제공되며, 해당 변수와 일치하는 ID를 추출하는 데 사용해야 합니다.
예를 들어, 내 변수 사용자가 로그인 또는 ID J665454를 얻는 경우 거기에서 ID 23을 추출할 수 있기를 원합니다. 마찬가지로 로그인 이름이 admin인 경우 ID 4를 추출하여 변수에 저장해야 합니다.
어떤 도움이라도 대단히 감사하겠습니다. 감사합니다!
답변1
$person
로그인 이름이 저장되어 있다고 가정하면 다음 GNU sed 명령을 사용하여 이를 달성할 수 있습니다 .
sed -En "s_\s*\|([0-9]+)\s*\|\s*$person\s*\|.+_\1_p"
예:
❯ set person Jack
❯ cat table.txt | sed -En "s_\s*\|([0-9]+)\s*\|\s*$person\s*\|.+_\1_p"
4
❯ set person David
❯ sed -En "s_\s*\|([0-9]+)\s*\|\s*$person\s*\|.+_\1_p" table.txt # also works
32
설명하다:
sed -E -n
: -E는 확장 정규식 플래그를 설정하고, -n은 명시적으로 지시하지 않는 한 sed가 인쇄하지 않도록 합니다.
s_<regex>_<replacement>_p
: s
는 대체 명령입니다( _
어떤 문자라도 가능합니다. _
가독성을 위해 선택했습니다). 정규식과 일치하여 대체 표현식으로 바꿉니다. 마지막 것은 p
그것을 인쇄하게 하고, 우리가 사용했기 때문에 -n
일치하는 줄만 인쇄하게 될 것입니다.
\s*\|([0-9]+)\s*\|\s*$person\s*\|.+
: 표현식의 정규 표현식 부분으로, 다음과 같이 설명됩니다.
정규식 | 중요성 |
---|---|
\s*\| |
이는 임의 개수의 공백(테이블이 공백으로 시작하는 경우)과 일치한 다음 리터럴과 일치합니다 | . 정규식에서는 특별한 의미를 갖기 | 때문에 탈출합니다 .| |
([0-9]+) |
이는 0-9 범위의 하나 이상의 문자와 일치합니다. 대부분의 정규식 엔진에서는 \d 이 기능을 사용할 수도 있지만 sed 지원되지 않습니다 \d . 표현식 주위의 괄호는 이를 대체에서 참조하는 데 사용할 수 있는 "그룹"에 넣습니다 \1-9 . 예를 들어, echo "hello" | sed "s_([aeiou])/\1\1_g" will generate 는 heelloo 각 모음이 2개의 복사본으로 대체되기 때문입니다(g 플래그를 사용하면 한 줄에 여러 번 작동하게 됩니다). |
\s*\|\s* |
임의의 공간(공백 없음 포함), 텍스트 | , 임의의 공간(공백 없음 포함) 순입니다. |
$person |
이 부분은 쉘로 대체될 것이며 sed는 이를 결코 볼 수 없으므로 Jack 스크립트가 호출될 때 일치하는 문자 또는 기타 항목으로 끝날 것입니다.$person |
\s*\| |
원하는 수의 공백(공백 없음 포함)과 text 를 일치시켜 찾고 있는 로그인이 일치하지 않는지 | 확인해야 합니다 .Jackie Jack |
.+ |
이는 줄 끝까지의 모든 항목과 일치합니다. 교체를 수행할 때 일치하지 않는 모든 항목이 여전히 인쇄되므로 전체 라인이 일치하는지 확인해야 하기 때문에 이는 중요합니다. |
\1
: 정규식이 일치하는 항목(전체 줄이기를 바랍니다)을 우리가 찾고 있는 ID 번호인 그룹 1로 바꿉니다. 그러면 전체 행이 해당 ID 번호만 유지하게 되므로 해당 행을 인쇄합니다.