한 줄의 모든 단어를 반복하는 Bash 스크립트?

한 줄의 모든 단어를 반복하는 Bash 스크립트?

다음과 같은 문자열이 있습니다.dog cat bird whale

그리고 나는 얻고 싶다dog dog cat cat bird bird whale whale

모든 단어가 같은 줄에 있습니다. 어떤 아이디어?

답변1

솔루션 제품군에 추가 :-) .

duplicator.sh:

for i; do echo -n "$i $i "; done; echo

실행 가능하게 만들고 지금:

$ ./duplicator.sh dog cat bird whale
dog dog cat cat bird bird whale whale

또는 쉘 함수로 사용(예: 스크립트 내에서 재사용 가능):

duplicator() {
    for i; do echo -n "$i $i "; done; echo
}

그런 다음 다음과 같이 정의된 곳에서 직접 실행할 수 있습니다.

duplicator dog cat bird whale

답변2

다음을 사용할 수 있습니다 sed.

sed -r 's/(\S+)/\1 \1/g' filename

파일의 변경 사항을 현재 위치에 저장하려면 다음과 같이 말하세요.

sed -i -r 's/(\S+)/\1 \1/g' filename

다음을 사용할 수도 있습니다 perl.

perl -M5.10.0 -ne 'say join " ", map{$_, $_} split " ";' filename

( -i변경 사항을 파일에 저장하는 옵션을 추가하세요.)

아니면 님이 제안한대로테르돈:

perl -M5.10.0 -ane 'say join " ", map{$_, $_} @F;' filename

에서 인용perlvar:

@F

배열에는 @F자동 분할 모드가 켜져 있을 때 읽은 각 줄의 필드가 포함되어 있습니다. 스위치 에 대해서는 perlrun을 참조하십시오 -a. 이 배열은 패키지별로 다르며 에서 실행될 때 기본 패키지에 없는 경우 전체 패키지 이름을 선언하거나 지정해야 합니다 strict 'vars'.

답변3

대답 이 없다면 이것은 무엇입니까 awk/gawk?

$ awk '{ for(i=1;i<=NF+1;i+=1/2) { printf("%s ",$i); }}' <<<"dog cat bird whale"
dog dog cat cat bird bird whale whale 

개행 종료가 중요한 경우:

$ awk '{ for(i=1;i<=NF+1;i+=1/2) { printf("%s ",$i); }} END{print ""}' <<<"dog cat bird whale"

답변4

예를 들어 변수에 문자열이 있으면 다음을 foo="dog cat bird whale"수행할 수 있습니다.

  • 순수한 배쉬:

    $ echo "$foo" | (read a b c d && echo "$a $a $b $b $c $c $d $d")
    dog dog cat cat bird bird whale whale
    

    설명:read및 가 echo동일한 서브쉘에서 발생하여 변수를 공유할 수 있도록 괄호가 필요합니다 . 그것들이 없으면 echo빈 줄만 인쇄됩니다.

  • 코어 유틸리티:

    $ join -j 5 -o 1.1,1.1,1.2,1.2,1.3,1.3,1.4,1.4 <(echo $foo) <(echo)
    dog dog cat cat bird bird whale whale
    

    설명:플래그 -o를 사용하면 join출력 형식을 설정할 수 있습니다. 여기서는 첫 번째 파일의 첫 번째 필드( 1.1)를 인쇄하고 그 다음에 첫 번째 파일의 두 번째 필드( ) 등을 인쇄하도록 지시합니다. 1.2이렇게 하면 첫 번째 파일의 각 필드가 두 번 인쇄됩니다. 그러나 join가입하도록 설계되었습니다.공통 필드의 입력 라인. 그래서 빈 줄( )도 전달하고 <(echo)무시합니다. -j조인 필드를 설정하고 존재하지 않는 필드(5번째)로 설정하면 전체 join행이 인쇄됩니다.

    공백이나 입력 순서에 관심이 없다면 다음을 수행할 수 있습니다.

    $ paste <(echo $foo) <(echo $foo)
    dog cat bird wale   dog cat bird wale
    
  • 펄 1:

    $ echo $foo | perl -lane 'push @k, $_,$_ for @F; print "@k"'
    dog dog cat cat bird bird whale whale
    

    설명:

    -l: adds a newline to each print call (among other things)
    -a: turns on field splitting, fields are saved as @F
    -n: process input line by line
    -e: give a script as a command line parameter.
    

    위의 스크립트는 (의 @F) 각 필드를 배열에 두 번 저장 @k한 다음 인쇄합니다 @k. 후행 개행 문자가 필요하지 않으면 다음과 같이 단순화할 수 있습니다.

    $ echo $foo | perl -ane 'print " $_ $_" for @F'
    
  • 펄 2:

    $ echo $foo | perl -0040 -pne 'print "$_"' | paste - - 
    dog dog cat cat bird bird whale whale
    

    설명:-0옵션은 입력 레코드 구분 기호를 설정합니다(16진수 또는 8진수로, 참조).여기전환용). 여기서는 040공백인 8진수로 설정했습니다 . make -pperl각 입력 "줄"을 인쇄하고 레코드 구분 기호를 공백으로 설정했기 때문에 이제 줄은 공백으로 정의되므로 모든 필드가 두 번 인쇄됩니다.

  • awk:

    $ echo $foo | awk '{for(i=1;i<=NF;i++){$i=$i" "$i;} 1;}'
    dog dog cat cat bird bird whale whale
    

    설명: NF는 필드 수이므로 위의 스크립트는 각 필드를 살펴보고 이를 자체적으로 추가합니다. 완료되면 해당 줄을 인쇄합니다( 1;인쇄의 약어입니다).

관련 정보