문자열로 바꿀 주석 행 무시
개시하다
갑작스럽지만 다음과 같은 시뮬레이션에 사용되는 매개 변수 파일[1]이 있다고 가정합니다.
calcmod.def
#CalcType = 0:Lanczos, 1:TPQCalc, 2:FullDiag, 3:CG, 4:Time-evolution
CalcType 0
평론 줄에서 말한 바와 같이 CalcType
의 값에 0에서 4의 정수 값을 지정하여 아날로그에서 사용하는 방법을 전환합니다.현재 수치가
Lanczos
의 0으로 지정되어 있는데, CG
의 3으로 바꾸려면 어떤 명령을 해야 하나요?답안
먼저 명령을 표시한 다음에 설명을 쓴다.
왜 네 가지 변화가 생기면 보충하는 거야?
또한 옵션
-i
은 파일을 직접 다시 쓰는 데 사용되는 옵션입니다.GNU 버전
sed -i -e '/^#/!{/CalcType/s/0/3/}' calcmod.def
#もしくは
sed -i -e "/^#/! {/CalcType/s/0/3/}" calcmod.def
BSD 버전
sed -i -e '/^#/!{;/CalcType/s/0/3/;}' calcmod.def
#もしくは
sed -i -e "/^#/! {;/CalcType/s/0/3/;}" calcmod.def
마지막 가장 일반적인 예에서 형식을 표시합니다.sed -i -e "/^コメント記号/! {;[アドレス]コマンド;}" ファイル名
주소와 명령의 연속성을 편리하게 하기 위해 주소를 [アドレス]
로 쓰지만 각괄호[]
는sed에 의미 있는 기호이므로 여분[]
을 쓰지 않도록 주의하십시오.설명
명령의 뜻을 차례대로 설명하다.
미묘하고 복잡한 부분도 보완한다.
단순 대체 - 주석 행에 걸립니다.
우선
sed
의 기본 교체 명령을 복습한다.# sed -e アドレス+コマンド ファイル名
sed -e "/CalcType/s/0/3/" calcmod.def
이 명령은 /CalcType/
까지 주소에 CalcType
를 포함하는 줄을 지정합니다.다음
s/0/3/
명령은 주소가 지정한 줄의 0을 3으로 바꿉니다.결과
calcmod.def
#CalcType = 3:Lanczos, 1:TPQCalc, 2:FullDiag, 3:CG, 4:Time-evolution
CalcType 3
되다주석에서 0이 3으로 대체됩니다.
평론이 결과에 영향을 미치지 않는다는 점을 감안하면 이렇게 시뮬레이션해도 문제가 없지만 다른 사람들이 이 파일을 볼 때 참수치의 뜻을 오해할 수 있으니 최대한 피해야 한다.
주석 행 대체 안 함
문자열 앞에 [억양자]
^
를 더하면 행 헤더에 지정된 문자열이 있음을 지정할 수 있습니다.또한 확장 태그
!
를 주소 뒤에 붙이면 지정된 문자열이 없는 줄을 지정할 수 있습니다.즉
/^#/!
를 주소로 지정하면 줄 헤더에 없는 줄#
을 지정할 수 있다.주소 조합
다음은 주석이 아닌 행의 조건
/^#/!
과 조건CalcType
을 조합하여 지정하는 방법을 소개한다.이것은 파괄호
/CalcType/
를 사용하여 실현할 수 있다.주소 뒤에
{}
로 묶으면 {}
의 명령은 처음에 지정한 주소에서만 실행됩니다.이번에 사용한 격식은요.
sed -e "アドレス1{アドレス2+コマンド}" ファイル名
의 형식으로 변하다.이렇게 하면 주소 1이 지정한 줄에 주소 2를 충족시키는 줄을 지정하여 명령을 실행할 수 있다.
따라서 주석이 아닌 줄
{}
의 한 줄에서 0을 3으로 바꾸는 명령은sed -e "/^#/!{/CalcType/s/0/3/}" calcmod.def
.하지만 이 지령은 움직이지 않는다.
그 이유는
CalcType
는 셸의 명령!
의 사양(BSD 버전만 해당)확장 태그 {} 는 셸의 명령입니다.
이 가능하다, ~할 수 있다,...
terminal
-bash: !{/CalcType/s/0/3/}": event not found
나는 이런 착오가 나타날 것이라고 생각한다.이것은
!
케이스에서 과거에 사용했던 명령을 실행하기 위한 것이다. 이 오류는 상응하는 과거 명령이 없기 때문에 발생한 것이다.!도피→불순
!
껍데기로 해석되지 않도록 명령은 피해야 하지만, 단순히 백슬래시!
\
만 더하면 문자로 해석할 수 있지만 \!
도 출력돼 움직일 수 없다.단일 따옴표 사용
가장 간편한 방법은 주소와 명령을 더블 인덱스
\
대신 싱글 인덱스 ""
로 묶는 것이다.#GNU版1
sed -e '/^#/!{/CalcType/s/0/3/}' calcmod.def
bash에 인용부호''
로 묶으면 변수 등이 전개되지 않기 때문에 아까 문제가 발생하지 않습니다.그러나 상술한 명령은 바꿀 때 변수를 사용할 수 없기 때문에 더블 인덱스로 피하는 방법을 고려해야 한다.
게다가 반대로 변수 등을 사용하지 않으면 상술한 명령만으로도 충분하다.
더블 따옴표의 따옴표 "도피"
더블 따옴표로 도피하는 방법은 두 가지가 있다.
우선 기타 웹 페이지에 싣는 방법으로 더블 인덱스
!
와 싱글 인덱스""
의 연결을 이용하여 싱글 인덱스''
로만 examination 표기!
를 묶는 방법을 소개한다.sed -e "/^#/"'!'"{/CalcType/s/0/3/}" calcmod.def
또 하나는 Exformation 표시''
뒤에 공간이 있으면 명령으로 식별할 수 없다는 것을 이용했다.즉 examination 로고
!
뒤에 빈칸을 붙이면 된다.#GNU版2
sed -e "/^#/! {/CalcType/s/0/3/}" calcmod.def
Linux 등에 포함된 GNU 버전 sed를 사용하는 경우 위에서 설명한 바와 같습니다.수고하셨습니다.
MacOS 등의 BSD 버전 sed를 사용할 때 아직 동작하지 않습니다.
명령 그룹에서 사용하는 파괄호
!
의 규격에 따라 상술한 명령은 BSD 버전sed의 제약을 만족시키지 못한다.다음은 그 제약을 설명하고 수정을 진행한다.
명령 그룹을 구성하는 데 사용되는 대괄호 {}의 사양(BSD 버전만 해당)
파괄호
{}
의 사용법{}
을 한 번 더 쓰면 처음 쓴 주소에서 괄호 안의 명령의 적용 범위를 줄일 수 있다.사실 정확한 격식은
アドレス{
コマンド
}
.즉,
アドレス{コマンド}
이후 줄 바꿈 필요{
이전에 다른 줄을 만들어야 합니다GNU 버전의 이 제한은 완화된 것 같아서 줄을 바꾸지 않아도 변동이 있다.
그럼, 이 제한을 만족시키기 위해서 나는 너에게 분호
}
를 주고 다른 줄을 지어줄게.#BSD版1
sed -e '/^#/!{;/CalcType/s/0/3/;}' calcmod.def
#BSD版2
sed -e "/^#/! {;/CalcType/s/0/3/;}" calcmod.def
끝맺다
습관이 된 사람에게는 그리 대단한 일이 아닐 수도 있지만, 여러 가지 함정이 생겨났다.
참고 문헌
프로그램 수정판
각주
이것은 \mathcal{H}\Phiparameter file입니다.↩︎
Reference
이 문제에 관하여(문자열로 바꿀 주석 행 무시), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/ultimatile/articles/4e78c2484277cf텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)