문자열로 바꿀 주석 행 무시

7466 단어 Bashsedtech

개시하다


갑작스럽지만 다음과 같은 시뮬레이션에 사용되는 매개 변수 파일[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입니다.↩︎

    좋은 웹페이지 즐겨찾기