문자열이 이전에 나타나면 sed를 사용하여 65-79 문자를 편집하십시오.

문자열이 이전에 나타나면 sed를 사용하여 65-79 문자를 편집하십시오.

sed를 사용하는 방법을 알아내려고 노력 중입니다(다른 도구를 사용할 수 있다는 것을 알고 있지만 sed에서 이 작업을 수행하는 방법을 알고 싶습니다. 다른 도구에서 더 의미가 있다면 알려주세요). 다음과 같은 내용을 포함하는 파일

1234561234567809912345612345678    00000999988STRING ONE        EX30 0600000001 K XXYY
1122331122334409922334466554433    00000123499STRING TWO        EX99 0600000002 K XXYY

그리고 다른 형식의 다른 많은 라인.

문자열 합계는 위치 47-64(뒤에 오는 공백 포함)에 있습니다 STRING ONE.STRING TWO

위치 65-80의 텍스트를 위치 47-64의 내용을 기반으로 다른 값으로 변경하고 싶습니다.

따라서 STRING ONE 라인의 경우 문자 65-80은 "AAAABBBBCCCC"(후행 공백 4개)로 수정됩니다.

STRING 2행에서 문자 65-80은 "XXXYYYZZZ"(후행 공백 4개)로 수정됩니다.

지금까지 내가 한 일:

sed 's/^\(.\{64\}\)EX/\1234567890 /'

문자 65의 "EX"는 "234567890"으로 대체되지만 이는

  • 올바른 줄 선택에 관계없이("문자열 1" 또는 "문자열 2" 사용)
  • "EX"만 교체

여기서는 중점을 두지 않은 다른 사항도 있습니다.

  • 여는 괄호와 백슬래시 중괄호 사이에 점이 있는 이유는 무엇입니까?
  • 1 앞에 백슬래시를 추가하는 이유는 무엇입니까(필요해 보이지만 대체 문자열에 1이 포함되지 않음)?

grep을 사용하여 이 작업을 수행하고 임시 파일이나 환경 변수에 대한 출력을 조작할 수 있으면 좋겠지만 이 작업을 더 우아하게 수행할 수 있는지 알아두면 좋을 것입니다.

답변1

.패턴의 "모든 문자"를 의미합니다. .\{64\}"64자" 중 하나를 의미합니다.

\1첫 번째 일치 그룹, 즉 \(...\)첫 번째 괄호 쌍과 일치하는 그룹에 대한 역참조입니다. 텍스트를 삽입하려면 1앞에 백슬래시를 붙이지 마십시오.

sed에서 "address"를 사용하여 다음과 같은 특정 줄로만 명령을 제한할 수 있습니다.

sed '/^.\{46\}STRING ONE \{8\}/s/^\(.\{64\}\).\{16\}/\1AAAABBBBCCCC    /'

그것은 말한다줄이 46자로 시작하고 뒤에 STRING ONE공백이 8개 오는 경우 처음 64자를 기억 \1하고 그 다음 16자를 기억된 문자로 바꾸고 그 뒤에 AAAABBBBCCCC공백이 4개옵니다.

주소가 포함된 명령을 더 추가하려면 세미콜론으로 구분하거나 여러 -e스위치를 사용하세요.

sed -e '/address1/s/pattern1/replacement1/;/address2/s/pattern2/replacement2/'
sed -e '/address1/s/pattern1/replacement1/' -e '/address2/s/pattern2/replacement2/'

관련 정보