2012-04-24 5 views
3

나는 bash에서 stdout에 일련의 줄을 출력하는 함수를 가지고있다. 나는 그들 사이에 몇 가지 구분 기호가있는 한 줄로 그들을 결합하고 싶습니다.줄을 하나의 문자열로 연결하는 방법

전 :

one 
two 
three 

후 :

one:two:three 

이 작업을 수행 할 수있는 쉬운 방법은 무엇입니까? glennJackman의 수정 그대로

awk '{printf("%s%s", sep, $0); sep=":"} END {print ""}' file 

또는 사용자가 지정한로 떠들썩한 파티 @ 촬영

답변

8

사용재미에 대한

$ echo -e 'one\ntwo\nthree' | paste -s -d':' 
one:two:three 
+0

정답입니다. 나는 그것을하기 위해 걷는 몇 가지 간단한 기능이 있다는 것을 알았다. – Shep

1

while read line ; do printf "%s:" $line ; done < file | sed s'/:$//' 

나는 이것이이 당신을 위해 작동 할 수

+0

흥미 point ...'awk' /'paste' /'grep' 등은 bash의 일부로 간주되지 않습니까? – Shep

+0

그것은 모두 당신의 관점에 달려 있습니다. bash는 쉘입니다. awk/paste/grep 등은 Unix 기반 쉘 내부에서 작업합니다. ash, bash, dash, ksh, rc, sh, zsh, et.al ;-) – shellter

+0

이러한 솔루션은 콜론을 내 보냅니다.그것을 피하기 위해서 sed에 파이프를 넣어 제거하거나 다음과 같이하면됩니다 : awk {printf ("% s % s", sep, $ 0); sep = ":"} END {print ""} '' –

2

도움이되기를 바랍니다 :

paste -sd':' file 
1

, 여기에 떠들썩한 - 유일한 방법 :

echo $'one\n2 and 3\nfour' | { mapfile -t lines; IFS=:; echo "${lines[*]}"; } 

출력

one:2 and 3:four 

{} 그룹이 실행되는 배열 변수를 참조하는 모든 명령을 확인하는 것입니다 동일한 하위 쉘에 있습니다. 변수는 파이프 라인이 끝나면 존재하지 않습니다.

http://www.gnu.org/software/bash/manual/bashref.html#index-mapfile-140

0

를 Input.txt

one 
two 
three 

펄 솔루션 :

@a = `cat /home/Input.txt`; 
    foreach my $x (@a) 
    { 
      chomp($x); 
      push(@array,"$x"); 
    } 
    chomp(@array); 
    print "@array"; 

실행 dummy.pl 스크립트와 :

$> perl dummy.pl | SED의///g '>과 Output.txt

과 Output.txt

한 두 세

2

그리고 다른 방법 :

cat file | tr -s "\n" ":" 
관련 문제