2012-11-27 2 views
13

I 텍스트 파일을 통해 루프 다음 ​​bash는 코드 라인으로 라인 .. 메신저는 각 라인 작업 '접두사'을 접두사로 시도 대신에이 오류 얻고있다 : 이것은 배쉬는파일의 각 줄 시작 부분에 문자열을 어떻게 추가 할 수 있습니까?

[email protected]:~/Desktop$ ./appendToFile.sh stusers.txt kp 
stusers.txt 
kp 
./appendToFile.sh: line 11: /bin/sed: Argument list too long 
[email protected],passw0rd 

입니다 스크립트 ..

#!/bin/bash 

file=$1 
string=$2 

echo "$file" 
echo "$string" 

for line in `cat $file` 
do 
    sed -e 's/^/prefix/' $line 
    echo "$line" 
done < $file 

여기서 내가 뭘 잘못하고 있니?

업데이트 : 파일의 헤드를 수행하면 모든 행이 터미널의 한 줄에 덤프됩니다 (아마도 관련이 있을까요?). 대신 루프의

[email protected]:~/Desktop$ head stusers.txt 
[email protected]:~/Desktop$ ouse.com,passw0rd 
+2

에 출력을 저장하려면

sed -e 's/^/prefix/' file.ext 

당신은 아마 파일에 잘못된 줄 끝에 있습니다. 아마도 당신은'dos2unix'를 원합니다. –

+0

@WilliamPursell 나는 파일에 대해 dos2unix를 실행하려했지만 새 라인을 삽입하지 않았고 가장 쉬운 해결책은 파일 내용을 새 파일에 복사하는 것입니다. – bobbyrne01

답변

28

:

awk '{print "prefix" $0}' file 
+1

너무 간단하고, 그것을 사랑해! 나는이 명령 출력을 파일로 리다이렉트했다. 고마워! – bobbyrne01

3

, while read... 사용하는 것이 더 적절하다 :

while read -r line; do 
do 
    echo "$line" | sed -e 's/^/prefix/' 
done < $file 

을하지만 당신은 간단 형편이 더 나은 것 :

sed -e 's/^/prefix/' $file 
+0

첫 번째 코드 블록이 새 접두어로 파일을 업데이트하지 않았습니다. 그리고 두 번째 블록은 단지 파일의 첫 번째 라인을 업데이 트 – bobbyrne01

3

펄 방식 다음과 같이하십시오 :

perl -p -e's/^/prefix' filename 

또는 filename 읽어서 STDOUT에 접두사를 출력 라인 중 하나의 경우에서,

perl -p -e'$_ = "prefix $_"' filename 

.

-i 플래그를 추가하면 Perl이 해당 파일을 수정합니다. 여러 개의 파일 이름을 지정할 수도 있으며 Perl은 모든 파일 이름을 마술처럼 처리합니다.

한 줄 awk 명령도 트릭해야
0

당신은 단지 각 통해 echo 명령에

while IFS= read -r line; do 
    echo "prefix$line" 
done < filename 

루프 반복을 문자열을 연결, 나오지도 필요하지 않습니다를 파일의 단어 :

for line in `cat file`; ... 
9

에 관한 Y 우리의 원래 오류 :

./appendToFile.sh: line 11: /bin/sed: Argument list too long

문제는이 코드 라인이다 :이 상황에서

sed -e 's/^/prefix/' $line

$ 라인가에 대해 실행 나오지 것을 파일 이름입니다. 코드를 수정하려면 같은이 줄을 수정해야합니다 :

echo $line | sed -e 's/^/prefex/'

(또한 원래의 코드가 마지막에 < $file이 안됩니다.)

윌리엄 퍼셀 (William Pursell)은 두 가지 제안 모두에서이 문제를 올바르게 해결합니다.

그러나 원본 텍스트 파일에 문제가 있음을 올바르게 확인했다고 생각됩니다. dos2unix은 캐리지를 제거하기 때문에이 문제를 해결하지 않습니다. 줄 끝에 Windows 스틱이 돌아옵니다. 그러나 Windows에서 Linux 파일을 읽으 려한다면 반환하지 않는 거대한 행이 생깁니다.

텍스트 파일의 줄 끝 문자에 문제가 없다고 가정하면 William Pursell 's , Andy Lester, 또는 nullrevolution의 답변이 효과적입니다.

while read... 제안의 변형 :

while read -r line; do echo "kp" $line; done < stusers.txt

+1

1) 필드 분할을 해제하여 선행 및 트레일 린 블랭크를 제거하지 않고 2) 여러 가지 이유로 변수를 인용하십시오. 'while IFS = read -r line; echo "kp" "$ line"; done

6

전체 : 이것은 쉘 (일괄/스크립트 파일에 대한 필요)에서 직접 실행할 수

while read -r line; do echo "PREFIX " $line; done < $file

루프는 전체 파일에서 작동하는 단일 sed 명령으로 바꿀 수 있습니다.

sed -e 's/^/prefix/' $file 
+1

라인이 비 었는지 여부를 확인할 수도 있습니까? –

+0

빈 줄을 비워 두시겠습니까? – Jack

+1

너무 오래 전에 ... 두 옵션을 모두 알면 도움이됩니다. –

0

sed를 사용하십시오. 단어 prefix 만 변경하십시오. 다른 파일

sed -e 's/^/prefix/' file.ext > file_new.ext 
관련 문제