"sed" 명령에 대해 알아보기

"sed" 명령에 대해 알아보기

파일에 names"이름 성" 형식의 이름 목록이 한 줄에 하나씩 포함되어 있다고 가정합니다. 이러한 이름은 정렬되지 않으며 성순으로 정렬되기를 원합니다. 그러나 각 줄의 이름 형식은 동일하게 유지되어야 합니다. 어느하나다음 명령은아니요올바르게 정렬된 이름 목록을 콘솔에 출력하시겠습니까?

[ ]cut -f 2 -d " " names | paste names - | sort -k 3 | cut -f 1

[x]sort -k 2 names ← 오답

[ ]sed 's/\(\w*\) \(\w*\)/\2 \1 \2/' names | sort | cut -f 2-3 -d " "

[ ]cut -f 2 -d " " names | sort

[ ]cut -f 2 -d " " names | paste - names | sort | cut -f 2

다음이 요청된 출력을 어떻게 생성하는지 이해할 수 없습니다.

sed 's/\(\w*\) \(\w*\)/\2 \1 \2/' names | sort | cut -f 2-3 -d " "

IE는 이름을 성을 기준으로 알파벳순으로 정렬하지만 "이름 성" 형식을 유지합니다. \w직업의 다음 단계는 무엇입니까 *? 파일명 뒤에 공백이 있어야 할 것 같아요. 여기에는 어떻게 \w적용되나요?

답변1

다음은 GNU에만 적용되며 sedBSD sed동작은 다릅니다.

좋습니다. 단계별로 살펴보고 다음 용도로 사용해 보겠습니다 names.

Alice Zylanzy
Zepher Applecart
Michael Copperside

우리는 이 명령을 사용하고 그것이 어떻게 작동하는지 단계별로 살펴보겠습니다.

$ sed 's/\(\w*\) \(\w*\)/\2 \1 \2/' names
Zylanzy Alice Zylanzy
Applecart Zepher Applecart
Copperside Michael Copperside

따라서 이 sed명령은 줄 앞에 반복되는 성을 추가합니다. 그런 다음 간단한 작업을 수행합니다 sort.

$ sed 's/\(\w*\) \(\w*\)/\2 \1 \2/' names | sort
Applecart Zepher Applecart
Copperside Michael Copperside
Zylanzy Alice Zylanzy

멋지네요. 이제 성별로 정렬되었군요. 이제 우리가 cut사용한 접두사를 제거하는 데 사용합니다.

$ sed 's/\(\w*\) \(\w*\)/\2 \1 \2/' names | sort | cut -f 2-3 -d " "
Zepher Applecart
Michael Copperside
Alice Zylanzy

..그들이 말했듯이 Bob은 당신의 삼촌입니다.

잡초 속으로어떻게명령 sed이 작동합니다: \w는 "단어 문자"를 의미하는 마법 주문이며 의 약어입니다 /[0-9A-Za-z_]/. \w*0개 이상의 "단어 문자"를 의미하며, 이것이 이름이 그룹화되는 방식입니다. 모든 이름에 밑줄이나 숫자가 없다고 가정하면 다음과 같이 다시 작성할 수 있습니다.

sed 's/\([A-Za-z]*\) \([A-Za-z]*\)/\2 \1 \2/' names

sed전체 명령 섹션을 섹션별로 분류하면 다음과 같습니다.

sed 명령 s은 "검색 및 바꾸기" 또는 "교체" 명령입니다. 첫 번째와 두 번째 s 사이의 표현식은 /두 번째와 세 번째 s /사이의 표현식 으로 대체됩니다.

그래서 우리는 이것을 대체할 것입니다:

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  (                        group and capture to \1:
    \w*                      word characters (a-z, A-Z, 0-9, _) (0 or
                             more times (matching the most amount
                             possible))
  )                        end of \1
                           ' '
  (                        group and capture to \2:
    \w*                      word characters (a-z, A-Z, 0-9, _) (0 or
                             more times (matching the most amount
                             possible))
  )                        end of \2

이것으로:

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  \2                       what was matched by capture \2
                           ' '
  \1                       what was matched by capture \1
                           ' '
  \2                       what was matched by capture \2

관련 정보