현재 날짜를 출력하려면 이 명령을 사용하라는 요청을 받았습니다 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
최선의 접근 방식은 아니지만 간단하고 잘 작동합니다.