AWK - SED - 숫자로 시작하는 경우 각 열의 시작 부분에 문자를 추가합니다.

AWK - SED - 숫자로 시작하는 경우 각 열의 시작 부분에 문자를 추가합니다.

숫자로 시작하는 각 열의 시작 부분에 문자를 추가하는 방법:

추가 예 c:
4 r4 8 8 4

그래서 나는 다음과 같은 결과를 얻습니다.
c4 r4 c8 c8 c4

다양한 수의 열에 대해 작동해야 합니다.

답변1

당신은 그것을 사용할 수 있습니다각 열을 한 번에 수정합니다.

sed -E 's/(^| )([[:digit:]])/\1c\2/g' input

필드 구분 기호가 공백이 아닌 경우 (^| )정규 표현식의 이 부분에 있는 공백을 필드 구분 기호로 바꾸세요.

  • -E기본 정규식(BRE) 대신 확장 정규식(ERE)을 사용하도록 지정합니다.
  • s:s/regexp/replacement/
  • (^| )캡처링 그룹의 줄 시작 또는 공백과 일치합니다.
  • ([[:digit:]])캡처 그룹의 숫자 일치
  • \1c\2첫 번째 캡처 그룹의 내용( \1), 문자 c, 두 번째 캡처 그룹의 내용( \2)
  • g세계적인

결과가 만족스럽고 구현이 이를 지원하면 FreeBSD 또는 macos와 같은 파생물에 추가 하여 파일을 수정할 sed수 있습니다 . ( 원본 파일을 백업하고 싶은 경우)-i-i ''-i.bak

답변2

나는 다음과 같이 -oneliner를 사용합니다 awk:

  • echo '4 r4 8 8 4' | awk '{ for (i=1; i<=NF; i++) if ($i ~ /^[0-9]/) $i = "c" $i }1'

도움이 되었기를 바랍니다 :)

답변3

사용행복하다(이전 Perl_6)

~$ raku -pe 's:g / <(^ | \s+)> \d  /{$/}c/;'  file

#OR

~$ raku -pe 's:g /  (^ | \s+) (\d) /$0c$1/;'  file

다음은 Perl 계열의 프로그래밍 언어인 Raku로 작성한 답변입니다. 위에서 파일은 한 줄씩 자동 인쇄 플래그를 사용하여 읽습니다 -pe. 교체는 :g전역적이며 다음과 같습니다. "줄의 시작 부분 ^이나 \s+공백 뒤에 \d숫자가 나오는 경우 이를 바꾸십시오. "

<(…)>첫 번째 예에서는 Raku의 캡처 태그를 사용하여 공백 뒤의 일치 항목을 제거했습니다. 결과 $/일치 개체가 대체 출력되고 그 뒤에 문자가 표시됩니다 c. 두 번째 예에서는 전체 일치 항목이 두 개의 캡처( $0$1)에 포함되어 교체로 출력됩니다 $0c$1.

입력 예:

4 r4 8 8 4

예제 출력:

c4 r4 c8 c8 c4

또는 (보다 명시적으로) 다음은 열 사이의 공백을 "정규화"합니다.

~$ raku -ne 'put .split(/ \s+ /).map: *.subst(/^ \d /, {"c$/" // ""});'  file

#OR

~$ raku -ne 'put .split(/ \s+ /).map: *.subst(/^ (\d) /, {"c$0" // ""});'   file

먼저 입력 행이 .split변수 공백( )에 있고, 각 열이 a로 시작하는 열에 \s+입력되고 , a가 일치 항목 앞에 추가됩니다(여기서는 match-object 또는 를 사용하여). 일치 항목이 정의되지 않은 경우(Raku의 "define-OR" 연산자 사용) 아무것도 삽입되지 않습니다. 반환된 열 사이에 공백이 있습니다.mapsubst^\dc$/$0//""

https://docs.raku.org/언어/regexes#Regexes
https://raku.org

답변4

    echo "4 r4 8 8 4" | sed -E 's/\<([[:digit:]])/c\1/g'

관련 정보