나는 교과서에서 이 코드를 발견했습니다. 책에는 1,/^[ ]*$/d
"1번째 줄부터 첫 번째 빈 줄까지 삭제"라는 의미만 나와 있습니다. 각 문자는 구체적으로 무엇을 의미하나요?
ed $1 << EOF
1,/^[ ]*$/d
w
q
EOF
답변1
1,/.../
는 첫 번째 줄부터 사이의 패턴과 일치하는 줄까지의 범위를 의미합니다 /
.
/^[ ]*$/
0 또는 줄의 [ ]*
처음 ^
부터 끝까지 공백이 포함된 줄과 일치합니다 .$
문제의 코드가 의도적인 것인지, 책의 정확한 복사본인지는 확실하지 않습니다. 단일 공간 주변의 괄호는 필요하지 않습니다. 아마도 원저자는 괄호 사이에 공백과 탭 문자를 두기를 원했을 것입니다. 이를 문자 클래스로 대체할 수 있습니다 [[:blank:]]
.
d
줄을 삭제하는 명령입니다
w
파일을 쓰세요
q
편집자를 그만둬라
ed
해당 명령은 다음을 통해 전송됩니다.여기 문서, 로 표시됩니다 << EOF
. 문자열 은 아래의 EOF
다른 EOF
네 줄과 쌍을 이루는 반임의적인 이름입니다. 따옴표 없이 놔두면 EOF
중간 줄의 모든 변수가 확장된다는 의미입니다.
여기서 주목해야 할 또 다른 사항은 예제의 인용되지 않은 입니다 $1
. 명령 ed
/스크립트는 첫 번째 위치 매개변수(스크립트 또는 함수에 대한 인수)에 대해 실행됩니다.추가 공백 분할 및 파일 이름 생성이 적용됩니다.. 그 주장은 실제로 인용되어야 한다. 자세한 내용은 다음을 참조하세요.쉘 스크립트가 공백이나 기타 특수 문자로 인해 막히는 이유는 무엇입니까?그리고bash/POSIX 쉘에서 변수를 인용하는 것을 잊어버린 경우의 보안 영향.
답변2
명령 및 입력
는 $1
편집할 파일 이름이고 EOF 사이의 모든 내용은 에 대한 명령입니다 ed
.
블로우 바이 블로우 설명1,/^[ ]*$/d
1,
줄부터 시작하다1
이 경우 검색 문자열이 처음 나타날 때까지 계속됩니다./
문자열을 검색하려고 한다는 것을 나타냅니다.^
파일의 줄 시작 부분과 일치시키려는 것을 나타냅니다.[
많은 문자를 지정하려고 함을 나타냅니다.- '
' 공백과 일치시키려고 합니다. 일반적으로 여기에는 더 많은 문자가 있습니다.
]
문자 지정 완료*
0개 이상의 공백(또는 사이의 모든 문자[]
) 과 일치시키려고 합니다.$
파일의 줄 끝까지/
검색 종료d
줄을 삭제하다
그런 다음 다음 줄에서 w
변경 사항을 쓰고 q
종료됩니다 ed
.
효과
파일의 ( $1
) 줄 1이 비어 있거나 공백만 있으면(탭 없음) 제거됩니다.