![Bash를 사용하여 텍스트 파일에서 태그된 문자열 추출](https://linux55.com/image/23136/Bash%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%ED%85%8D%EC%8A%A4%ED%8A%B8%20%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20%ED%83%9C%EA%B7%B8%EB%90%9C%20%EB%AC%B8%EC%9E%90%EC%97%B4%20%EC%B6%94%EC%B6%9C.png)
다음과 같은 스타일의 파일이 있습니다. 이는 #
환경에 따라 매개변수화된 구성 파일이며, 문자의 값은 데이터베이스의 실제 값으로 대체됩니다.
ABC=#PARAMETER_1#:#PARAMETER_2#
SOMETHING_ELSE=#PARAMETER_1#
SOMETHING_NEW=#PARAMETER_2##PARAMETER_3#
#
필요한 매개변수를 쉽게 식별할 수 있도록 이 파일에서 해시/파운드( ) 문자 사이의 값을 추출하고 싶습니다 . 표준 열 너비나 이와 유사한 것은 없으며 유일한 표준은 #
두 문자 사이의 모든 내용이 데이터베이스의 값으로 대체된다는 것입니다.
다음은 이상적인 정리 및 중복 제거 출력입니다.
PARAMETER_1
PARAMETER_2
PARAMETER_3
나는 보았다이것질문이지만 중요한 차이점은 제 경우에는 특정 행에 변수가 여러 개 있을 수 있다는 것입니다.
나는 이 질문에 Bash로 태그를 달았지만 꼭 그럴 필요는 없습니다. Perl 등일 수도 있습니다. 단지 Unix의 명령줄에서 실행하면 됩니다.
답변1
처음에는 다음과 같이 생각했습니다 awk
.
awk -vRS='#[^#]+#' 'RT{gsub(/#/,"",RT);p[RT]=1}END{for(i in p)print i}' the_file
하지만 이 결정은 귀하가 수행해야 할 다른 작업에 따라 달라질 수 있습니다.
설명하다댓글에서 요청한대로.
awk -vRS='#[^#]+#' ' # use /#[^#]+#/ as record separator
RT { # record terminator not empty?
gsub(/#/,"",RT) # remove the # parameter delimiter markup
p[RT]=1 # store it as key in array p
}
END { # end of input?
for (i in p) print i # loop through array p and print each key
}' the_file
중요한 부분은 RT
(레코드 종료자) 내장 변수를 사용하는 것입니다.
RT The record terminator. Gawk sets RT to the input text that matched the character or regular expression specified by RS.