다음 형식의 텍스트 파일이 있습니다.
c4 c4 r4 c8 c8 e2 e2 c1
c4 c4 r4 c8 c8 c1 e2 e2
c4 c4 r4 e2 e2 c8 c8 c1
c4 c4 r4 e2 e2 c1 c8 c8
c4 c4 r4 c1 e2 e2 c8 c8
c4 c4 r4 c1 c8 c8 e2 e2
c4 c4 c8 c8 r4 e2 e2 c1
c4 c4 c8 c8 r4 c1 e2 e2
c4 c4 c8 c8 e2 e2 r4 c1
c4 c4 c8 c8 e2 e2 c1 r4
c4 c4 c8 c8 c1 e2 e2 r4
c4 c4 c8 c8 c1 r4 e2 e2
c4 c4 e2 e2 c8 c8 r4 c1
c4 c4 e2 e2 c8 c8 c1 r4
c4 c4 e2 e2 r4 c8 c8 c1
행의 중복 열에서 모든 숫자를 제거하고 싶지만 값이 다른 숫자로 변경된 경우에도 항상 첫 번째 접근 방식을 유지합니다. 따라서 출력은 다음과 같습니다.
c4 c r c8 c e2 e c1
c4 c r c8 c c1 e2 e
c4 c r e2 e c8 c c1
c4 c r e2 e c1 c8 c
c4 c r c1 e2 e c8 c
c4 c r c1 c8 c e2 e
c4 c c8 c r4 e2 e c1
c4 c c8 c r4 c1 e2 e
c4 c c8 c e2 e r4 c1
c4 c c8 c e2 e c1 r4
c4 c c8 c c1 e2 e r4
c4 c c8 c c1 r4 e2 e
c4 c e2 e c8 c r4 c1
c4 c e2 e c8 c c1 r4
c4 c e2 e r4 c8 c c1
가능한 숫자는 (1-64)입니다.
답변1
GNU1을 사용하면 sed
다음을 수행할 수 있습니다.
$ sed -Ee ':1;s/(\<[[:alpha:]]([[:digit:]])+\>[[:alpha:][:space:]]*\<[[:alpha:]])\2\>/\1/;t1' < file
c4 c r c8 c e2 e c1
c4 c r c8 c c1 e2 e
c4 c r e2 e c8 c c1
c4 c r e2 e c1 c8 c
c4 c r c1 e2 e c8 c
c4 c r c1 c8 c e2 e
c4 c c8 c r4 e2 e c1
c4 c c8 c r4 c1 e2 e
c4 c c8 c e2 e r4 c1
c4 c c8 c e2 e c1 r4
c4 c c8 c c1 e2 e r4
c4 c c8 c c1 r4 e2 e
c4 c e2 e c8 c r4 c1
c4 c e2 e c8 c c1 r4
c4 c e2 e r4 c8 c c1
perl
같은
perl -pe '1 while s/\b\pL(\d+)\b[\pL\s]*\b\pL\K\1//' < file
두 경우 모두 교체 항목이 있을 때마다(또는 사용) <word-boundary><letter><digits><word-boundary><any-amount-of-letters-and-whitespace><word-boundary><letter><same-digits><word-boundary>
동일한 항목으로 교체하고 제거하고 반복합니다.<same-digits>
t
while
¹ GNUisms의 명령 :
뒤에는 또 다른 명령이 옵니다. 표준에서는 sed
별도의 -e
표현 -E
(실제로는 BSDism), \<
/ \>
(실제로는 ex/vi'ism, 일부는 sed
이를 지원 [[:<:]]
하거나 [[:>:]]
이에 \b
상응하는 표현)이 필요합니다.