cal을 사용하여 현재 날짜를 출력합니다.

cal을 사용하여 현재 날짜를 출력합니다.

현재 날짜를 출력하려면 이 명령을 사용하라는 요청을 받았습니다 cal.

지금까지 _현재 날짜 이전에 기호가 있다는 것을 발견했습니다. 나는 grep: here 를 사용하기로 결정했지만 cal | grep '\b_*'일주일 내내 출력합니다. 나는 여러 가지 변형을 시도했지만 성공하지 못했습니다.

실제로 현재 날짜가 한 자리만 있는 경우도 있어서 tr -d ' '여기서는 그걸 활용해야 할 것 같습니다.

이 모든 명령을 함께 결합하는 방법을 모르겠습니다.

답변1

이를 수행하는 올바른 방법은 다음을 사용하는 것입니다 date.

% date +%d
19

표시되는 밑줄은 밑줄이 아니라 터미널에 표시되는 제어 문자입니다. 만약 너라면진짜그것을 사용하려면 cal해당 제어 문자가 무엇인지 찾아서 찾아야 합니다. 이와 같은 것을 사용하여 이것을 사용할 수 있습니다 cal | xxd.

또 다른 문제는 cal이 제어 문자가 stdout이 tty인 경우에만 출력된다는 점입니다. 따라서 이것이 하나라는 것을 확신시켜야 합니다( script이 점을 고려하십시오).

답변2

명령의 출력이 cal터미널이 아닌 경우 오늘 날짜 숫자에 가난한 사람의 밑줄을 적용합니다. 이는 밑줄을 그을 각 문자 앞에 밑줄과 백스페이스 문자를 추가하는 방식으로 구성됩니다. 문자를 시각적으로 표시하여 이를 확인할 수 있습니다( ^H의미Control-H, 백스페이스 문자임):

cal | cat -A
cal | cat -vet

또는 16진수 덤프를 보면 다음과 같습니다.

cal | hd
cal | od -t x1

따라서 필요한 것은 밑줄 문자를 감지하여 출력하는 것입니다.

GNU grep을 사용하면 옵션을 사용하여 정규 표현식과 일치하는 모든 항목을 쉽게 인쇄할 수 있습니다 -o. 밑줄 문자는 리터럴 백스페이스 문자가 두 문자의 합이 아니고 인쇄할 문자 _^H.인 확장 정규식과 일치합니다 . 이것이 cal이 백스페이스 문자를 입력하는 대신 출력에 밑줄을 사용할 수 있는 유일한 방법이라고 신뢰할 수 있습니다. 따라서 밑줄을 감지하고 백스페이스를 비교할 수 없는 문자로 유지하는 것으로 충분합니다.^H^H.

cal | grep -o '_..'

거의 비슷했지만 출력에는 밑줄-백슬래시 시퀀스가 ​​포함되어 있고 숫자는 다른 줄에 있습니다. 숫자가 아닌 모든 문자를 제거하고 후행 줄 바꿈을 다시 추가할 수 있습니다.

cal | grep -o '_..' | tr -d 0-9; echo

또는 패턴을 반복하여 _..밑줄이 그어진 숫자 여러 개를 일치시킬 수 있습니다. 그러면 출력에 밑줄이 남게 되며 tr 또는 sed를 사용하여 제거할 수 있습니다.

cal | grep -E -o '(_..)*'
cal | grep -E -o '(_..)*' | tr -d '\b_'
cal | grep -E -o '(_..)*' | sed 's/_.//g'

sed를 사용하여 이 작업을 수행할 수 있지만 완전히 간단하지는 않습니다. Sed는 일치하는 행만 인쇄하는 간단한 방법을 제공하지만( -n명시적으로 인쇄된 행만 가져오려면 이 옵션을 사용하십시오), 한 행에서 일치 항목이 여러 번 인쇄되는 직접적인 방법은 없습니다. 이 문제를 해결하는 한 가지 방법은 밑줄 문자가 최대 2개라는 점을 활용하여 하나의 s명령을 사용하여 단일 밑줄 문자가 포함된 행을 변환하여 출력하고, 또 다른 명령을 사용하여 두 개의 밑줄 문자가 포함된 행을 변환하여 출력하는 것입니다. 이전과 마찬가지로 백스페이스 키를 명시적으로 일치시키지 않습니다.

cal | sed -n 's/.*_.\(.\)_.\(.\).*/\1\2/p; s/.*_.\(.\).*/\1/p'

sed를 사용하는 또 다른 접근 방식은 한 줄에 밑줄 친 세그먼트가 하나만 있다고 가정하고 앞뒤의 모든 것을 제거하는 것입니다.

cal | sed -n 's/^[^_]*_/_/; s/\(_..\)[^_]*$/\1/p'

그러면 밑줄이 남습니다. 세 번째 교체로 제거할 수 있습니다.

cal | sed -n 's/^[^_]*_/_/; s/\(_..\)[^_]*$/\1/; s/_.//gp'

답변3

나는 지금 GNU cal 명령 앞에 있지 않지만 이것은 당신이 원하는 것에 더 가깝습니다:

cal | grep -Eo '_[[:digit:]]+' | sed 's/_//'

grep은 -E확장 정규식이 허용됨을 나타냅니다([[:digit:]] 클래스의 경우). 이 -o플래그는 sed 명령이 밑줄을 제거함을 나타냅니다.

이것은 cal + grep의 접근 방식이지만크리스가 말한다, 현재 날짜를 얻는 일반적인 방법은 명령을 사용하는 것입니다 date.

답변4

cal | cat -vet | grep -o "H....." | cut -c 2,6

최선의 접근 방식은 아니지만 간단하고 잘 작동합니다.

관련 정보