패턴이 포함된 문자열을 대체하기 위해 sed를 사용하고 싶습니다.

패턴이 포함된 문자열을 대체하기 위해 sed를 사용하고 싶습니다.

이라는 파일에 다음 줄이 있습니다 ref.list.

234      ./XYZ_SiteMetric_TIMESTAMP.dat

456      ./XYZ_Site_TIMESTAMP.dat

나는 그것들을 만들어야 합니다:

234      SiteMetric

456      Site

내 스크립트에서는 다음 명령을 사용합니다.

sed -i 's/\*SiteMetric\*/SiteMetric/g' ref.list

sed -i 's/\*Site\*/Site/g' ref.list

목록 파일에는 유사한 줄이 많이 있습니다.

을 사용하여 스크립트를 실행하면 sh -x오류가 없으며 명령이 실행됩니다. 그러나 파일에는 아무것도 변경되지 않습니다.

참고: XYZ_두 행의 부품은 항상 동일합니다. 하지만 timestamp부품은 다릅니다.

답변1

임의 개수의 문자에 대한 구문은 입니다 .*. *이전 문자 또는 표현식과 일치하는 수만 나타냅니다. 즉, .*표시된 일치 항목 수에 관계없이 .모든 문자와 일치할 수 있습니다.

답변2

더 짧은 솔루션은 어떻습니까?

sed -ri -e 's%[.]/XYZ_(.*)_TIMESTAMP.dat%\1%' ref.list

모든 입력이 이 패턴을 따른다고 가정합니다.

답변3

Site/SiteMetric에 문자가 없고 _(변수인지 확실하지 않음) 스키마가 정적이라고 가정하면 다음을 수행할 수 있습니다.

sed 's/\.[^_]*_//;s/_.*//;'

첫 번째 부분은 부분을 s삭제 ./XYZ_하고 두 번째 부분은 부분을 삭제합니다 _TIMESTAMP.dat.

관련 정보