Bash 스크립트를 사용하여 현재 날짜를 .cfg/text 파일에 씁니다.

Bash 스크립트를 사용하여 현재 날짜를 .cfg/text 파일에 씁니다.

현재 날짜를 월/일(예: 6/18)로 .cfg 파일에 인쇄하려고 합니다(특정 줄을 변경해야 하므로 sed를 사용함). 그러나 bash를 실행할 때 출력의 날짜는 정확하지만 파일을 검사할 때 날짜 대신 명령이 인쇄됩니다. 어떤 제안이 있으십니까?

sed -i -- 's/^example=.*/example="$(date)"/g' /path/to/config.cfg

또한 날짜는 전체 날짜(2020년 6월 18일 목요일 19:34:14 EDT)만 인쇄합니다. 월/날짜만 원합니다.

미리 감사드립니다! ! !

답변1

쉘은 작은따옴표로 묶인 문자열 내부의 어떤 것도 확장하지 않습니다.

sed표현식에는 큰따옴표로 묶인 문자열을 사용해야 합니다 .

sed -i "s,^\(example=\).*,\1$(date +%m/%d)," /path/to/config.cfg

또는 두 개의 작은따옴표 문자열을 사용하고 그 사이에 큰따옴표로 명령을 바꿉니다.

sed -i 's,^\(example=\).*,\1'"$(date +%m/%d)"',' /path/to/config.cfg

또는 date출력 sed표현식을 다음과 같이 지정합니다.

sed -i "$(date +'s,^\(example=\).*,\1%m/%d,')" /path/to/config.cfg

(근데 이건 좀 어색해 보이네요.)

텍스트에 대한 역참조를 사용하여 표현식을 조금 더 짧게 만들었습니다 example=. 문자가 포함된 대체 부분의 문자열을 처리하기 때문에 in을 명령의 구분 기호 ,로 사용하고 있습니다 (대안은 이스케이프 문자를 생성하기 위한 형식 문자열 로 사용하는 것입니다 ).s///sed/%m\\/%ddate/

sed위 명령의 첫 번째 변형에서는 전체 표현식이 인용되기 때문에 명령 대체 주위에 큰따옴표를 사용할 필요가 없습니다 . 또한 /g명령 끝에 있는 것은 필요하지 않습니다 s///. 왜냐하면 패턴이 줄의 시작 부분에 고정되어 있기 때문에 패턴이 여러 번 일치할 것이라고 기대할 수 없기 때문입니다. --당신이 사용한 것도 삭제했습니다 . 일부 sed구현에서는 이 문자열을 백업 접미사, 즉 옵션에 대한 옵션 인수 -i(예: sedmacOS)로 거의 확실하게 사용합니다.

date +%m/%d필요한 날짜 형식을 생성하는 데 사용합니다 . 그러면 06/19오늘 날짜가 생성됩니다 . 현재 날짜의 숫자가 0으로 채워지는 것을 원하지 않으면 %e대신 사용하십시오 %d( 참조 man strftime). 숫자에 0을 추가하지 않고 월을 가져오는 표준 형식은 없는 것 같지만, GNU를 사용하면 date비표준 %-m형식을 사용할 수 있습니다(예: date +%-m/%e참고 man date).

관련 정보