다음과 같은 문자열이 있습니다.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-p
는perl
각 입력 "줄"을 인쇄하고 레코드 구분 기호를 공백으로 설정했기 때문에 이제 줄은 공백으로 정의되므로 모든 필드가 두 번 인쇄됩니다.awk
:$ echo $foo | awk '{for(i=1;i<=NF;i++){$i=$i" "$i;} 1;}' dog dog cat cat bird bird whale whale
설명:
NF
는 필드 수이므로 위의 스크립트는 각 필드를 살펴보고 이를 자체적으로 추가합니다. 완료되면 해당 줄을 인쇄합니다(1;
인쇄의 약어입니다).