세 번째 숫자 필드를 텍스트로 변경하는 방법은 무엇입니까?

세 번째 숫자 필드를 텍스트로 변경하는 방법은 무엇입니까?

다음과 같은 형식이 있습니다.

983243 woiewewrsadhjf 234
093111 srewdslkjfdgdsdsf 111

sed를 사용하여 세 번째 필드에서 텍스트의 모든 인스턴스를 검색하고 해당 인스턴스만 변경하고 다른 세 번째 필드는 변경하지 않을 수 있습니까? 따라서 세 번째 필드에서 111을 검색하면 111을 포함하는 세 번째 필드는 모두 다른 텍스트로 변경되고 다른 세 번째 필드(예: 234)는 그대로 유지됩니다.

가능하다면 명령이 어떻게 구성되는지 이해할 수 있도록 이 솔루션을 분석해 주실 수 있나요? 나는 배우기 위해 여기에 있습니다.

답변1

이것이 필수가 아닌 경우 해결책 sed은 다음과 같습니다 awk.

awk '$3=="111"{$3="othertext"}1' input.txt

각 행에 대해 세 번째 필드(기본적으로 공백으로 구분된 문자 그룹으로 식별됨)가 동일한지 확인하고 111, 그렇다면 로 설정합니다 othertext. 입력 데이터가 다른 구분 기호(예: )를 사용하는 경우 명령줄 옵션(예: )을 사용하여 지정 TAB해야 합니다 .-Fawk -F'\t' '....'

1규칙 블록 외부( { ... }또는 실제로 "true"/0이 아닌 것으로 평가되는 모든 조건)는 awk모든 수정 사항을 포함하여 현재 줄을 인쇄하도록 지시합니다. 이렇게 하면 변경할 필요가 없는 줄이 "있는 그대로" 인쇄됩니다.

참고: 개별 필드에서 변경해야 하는 행은 내부적으로 단일 공백으로 설정된 awk변수로 저장된 "출력 필드 구분 기호"를 사용하여 재구성됩니다 . OFS이는 일반적으로 문제가 되지 않지만 열이 여러 공백으로 구분된 경우 이러한 구분 기호는 (기본적으로) 다음과 같이 해석됩니다.싱글변경된 필드 구분으로 출력에 줄이 표시되도록 구분 기호를 입력합니다.

답변2

필드는 sed그림과 같이 처리됩니다. 먼저, 공백이 아닌 세 번째 블록을 패턴 공간에 존재하지 않는 것으로 알려진 문자(예: 레코드 구분 기호)로 격리하여 표시합니다 \n. 그런 다음 교체가 성공하면 => 세 번째 필드에 111이 있습니다. 그렇지 않으면 개행 문자를 제거합니다.

우리는 GNU sed확장된 정규식 플래그를 켜서 사용하고 있습니다.-E

$ sed -Ee '
    s/\S+/\n&\n/3
    s/\n111\n/otherwise/
    s/\n//g
' file

Posixly 우리는 이것을 수행합니다:

$ sed -e '
    s/[^[:space:]]\{1,\}/\
&\
/3
    s/\n111\n/otherwise/
    s/\n//g
' file

답변3

echo '093111 srewdslkjfdgdsdsf 111' | sed 's/\(.*\) \(.*\) \(111\)/\1 \2 othertext/'

이것이 당신이 원하는 것입니다.

검색 중인 텍스트(이 예에서는 111)에는 또는 \같은 특수 문자가 포함되어 있지 않습니다 . 이런 경우에는 탈출해야 합니다..*

설명하다

.모든 문자 와 일치합니다 .

*이전 원자의 0개 이상의 반복을 나타냅니다.

따라서 글을 쓸 때 .*모든 문자 시퀀스를 일치시킵니다. 대부분의 경우 sed는 탐욕적입니다. 즉, 가능한 가장 큰 시퀀스와 일치시키려고 시도합니다. 그러나 다음 문자는 공백이어야 하므로 .*공백을 찾으면 일치가 완료됩니다.

기본 정규식(sed의 기본값)을 사용하면 \(및 를 사용하여 \)서로 다른 원자를 분리 할 수 있습니다. 우리는 이를 사용하여 3개의 원자에 라벨을 붙입니다.

명령의 두 번째 부분에서는 \n"n 위치의 원자"를 의미합니다. 첫 번째와 두 번째를 사용하지만 세 번째는 필요한 텍스트로 대체합니다.

참고: 필드(공백으로 구분) 작업 시 awk를 사용하는 것이 더 쉬운 경우가 많습니다.

echo '093111 srewdslkjfdgdsdsf 111' | awk '{if ($3 == "111") $3 = "othertext"; print}'

관련 정보