sed -e"s@uid=[0-9]*(@@g"-e"s@).*\$@@g"
나는 노력했다
s
= 검색
[0-9]*
= 0-9로 시작하는 숫자만 검색
답변1
귀하의 명령은 sed
아무 이유 없이 ("검색"이 아닌 교체) 명령 @
에 대한 구분 기호로 사용되어 s///
읽기가 어렵습니다.
두 번째 공백 앞의 누락된 공백이 -e
오타이고 문자열에 가독성을 위해 더 많은 공간을 제공한다고 가정하면 다음과 같습니다.
sed -e "s@uid=[0-9]*(@@g" -e "s@).*\$@@g"
이는 다음과 관련이 있습니다.
sed -e "s/uid=[0-9]*(//g" -e "s/).*\$//g"
작은따옴표가 있는 문자열은 다음과 같습니다.
sed -e 's/uid=[0-9]*(//g' -e 's/).*$//g'
(참고 \$
→ $
) 또는
sed 's/uid=[0-9]*(//g; s/).*$//g'
따라서 다음은 sed
두 개의 편집 표현식을 사용하는 호출입니다.
s/uid=[0-9]*(//g
uid=
이는 숫자 뒤에 오는 모든 하위 문자열을 대체하고 a는(
아무 것도 대체하지 않습니다(해당 문자열은 삭제됩니다). 후행을 사용하면g
첫 번째 일치 항목뿐만 아니라 라인의 겹치지 않는 모든 일치 항목에 대해 이 작업이 수행됩니다.uid=1(a) uid=2(b)
로 변환되다
a) b)
s/).*$//g
이렇게 하면
)
줄의 처음부터 끝까지 아무것도 없는 것으로 대체되어 모든 내용이 제거됩니다.g
줄 끝 부분에 대한 고정으로 인해 표현식이 한 번만 일치하도록 보장되기 때문에 여기서는 이것이 필요하지 않습니다$
.위의 예는 다음과 같습니다.
a) b)
지금 바로 입장하세요
a
g
이로 인해 각 명령의 후행이 너무 많은 사후 판단 없이 추가되었다고 믿게 됩니다 (두 번째 명령은 확실히 필요하지 않으며 두 번째 표현식은 첫 번째 명령의 모든 것을)
제거 합니다).첫 번째g
불균형 괄호가 있는 데이터를 처리하지 않는 한 아무런 효과가 없습니다. 이것들은 아마도 제거되어야 할 것입니다.
추가 예로, 명령은 다음과 같이 변경됩니다.
this is (line 1) of the file
hello world uid=09(a) uid=213(b)
입력하다
this is (line 1
hello world a
이 명령의 컨텍스트에 대해 더 잘 모릅니다(어디에서 보았는지, 무엇인지)~해야 한다등), 이에 대해 더 자세히 말하거나 개선 사항을 제안하기는 어렵습니다.
답변2
나는 그것이 다음을 포함하는 라인/변수를 얻으려고 시도하고 있다고 생각합니다.
uid=500(존 스미스)
...다음과 같이 단순화합니다.
존 스미스
대괄호 외부의 모든 항목과 대괄호 자체를 제거하여 대괄호 내부에서 실제/사용자 이름을 추출하려고 시도합니다.
물론, 숫자는 임의의 숫자일 수 있고 이름은 임의의 이름일 수 있습니다.