Bash에서 파일의 각 줄 뒤에 문자열을 어떻게 추가합니까?


112

bash를 사용하여 파일의 각 줄 뒤에 문자열을 어떻게 추가합니까? sed 명령을 사용하여 수행 할 수 있습니까? 그렇다면 어떻게해야합니까?

답변:


188

매개 변수 sed를 통한 내부 편집을 허용하는 경우 -i:

sed -e 's/$/string after each line/' -i filename

그렇지 않은 경우 임시 파일을 만들어야합니다.

typeset TMP_FILE=$( mktemp )

touch "${TMP_FILE}"
cp -p filename "${TMP_FILE}"
sed -e 's/$/string after each line/' "${TMP_FILE}" > filename

touch임시 파일입니까? 그리고 나는 sed명령의 성공을 조건부로 만들 cp거나 원본을 잃을 수 있습니다.
추후 공지가있을 때까지 일시 중지되었습니다.

임시 이름을 빠르게 예약하기 위해 파일을 만졌습니다. 이것은 필요하지 않을 수 있습니다. cp의 성공을 조건으로 sed 명령을 만드는 것이 옳다고 생각합니다. 코드를 수정하여 수정하는 것은 어떻습니까? 나는 조금 신경 쓰지 않을 것이다! 너의 것, Tom
Tom DeGisi

앞에 문자열을 추가하는 것은 어떻습니까?
Oxwivi

10
@Oxwivi : sed -e 's/^/string after each line/' -i filename $는 줄 끝을 의미합니다. ^는 줄의 시작을 의미합니다.
Tom DeGisi 2012

sed에 파이핑하는 경우 sed 's/^/string after each line/'예상대로 수행하지만 (각 줄 앞에 추가) sed 's/^/string after each line/'수행하지 않습니다 (전체 줄을 내 추가 문자열로 바꿉니다). 무엇을 제공합니까? @TomDeGisi 어떤 아이디어?
philadams

17

나는 awk. 열이 하나만있는 경우를 사용 $0하고 그렇지 않으면 마지막 열로 바꿉니다.

일방 통행,

awk '{print $0, "string to append after each line"}' file > new_file

아니면 이거,

awk '$0=$0"string to append after each line"' file > new_file

1
또한, (내 경우 있다는) 줄 번호를 추가, 하나는 사용할 수있는 NR변수를 :awk '{print $0, NR}'
andrybak

2
@optimus 나는 당신의 방법을 시도했지만 여분의 공간을 얻었습니다. 제거하는 방법에 대한 아이디어가 있습니까?
Adil Saju

@AdilSaju sed 's/ //g'이것은 내 요구 사항에 적합했지만 모든 줄의 공간을 제거하므로 한 줄의 모든 옵션 g이 있습니다.
Eklavyaa

@AdilSaju 세부 사항을 추가하십시오. 새로운 질문을하는 것이 좋습니다.
Optimus Prime

@AdilSaju awk , 좋아요 제거 {print $0"string to append after each line"}.
Culip

8

가지고 있다면 lam (laminate) 유틸리티가이를 수행 할 수 있습니다. 예를 들면 다음과 같습니다.

$ lam filename -s "string after each line"

4
  1. 순수 POSIX 쉘sponge:

    suffix=foobar
    while read l ; do printf '%s\n' "$l" "${suffix}" ; done < file | 
    sponge file
  2. xargsprintf:

    suffix=foobar
    xargs -L 1 printf "%s${suffix}\n" < file | sponge file
  3. 사용 join:

    suffix=foobar
    join file file -e "${suffix}" -o 1.1,2.99999 | sponge file
  4. 쉘 도구를 사용하여 paste, yes, headwc:

    suffix=foobar
    paste file <(yes "${suffix}" | head -$(wc -l < file) ) | sponge file

    앞에 문자 를 paste삽입합니다 .$suffix

물론 다른 답변과 마찬가지로 sponge나중에 mv원래 파일 이름 위에 임시 파일로 바꿀 수 있습니다 ...


1
sed리소스가 매우 제한되지 않는 한 이들 중 어느 것도에게 선호 되지 않습니다.
agc

나는 sed가 아닌 솔루션을 좋아합니다. sed그런 간단한 일에는 필요하지 않습니다.
Bruce

1

나는 선호한다 echo. 순수 bash 사용 :

cat file | while read line; do echo ${line}$string; done

-9

Sed는 약간 못 생겼습니다. 이렇게 우아하게 할 수 있습니다.

hendry@i7 tmp$ cat foo 
bar
candy
car
hendry@i7 tmp$ for i in `cat foo`; do echo ${i}bar; done
barbar
candybar
carbar

2
셸의 최대 인수 제한보다 많은 줄이있는 파일에 대해 실패합니다. 시도 : cat foo | 읽는 동안; echo $ {a} bar; 완료 또는 그와 비슷한 것; 대부분의 경우에 적합한 대체품입니다.
alex

1
공백이있는 줄에서도 실패합니다.
추후 공지가있을 때까지 일시 중지되었습니다.

1
어, 아니 그것은 데니스를 실패하지 않습니다. 쉘의 최대 인수 제한? Crikey 당신은 펜던트입니다.
hendry

네 그렇습니다 : $ cat foo foo bar baz alex @ armitage : ~ $ for i in cat foo; 에코 $ {i} bar; 완료 foobar barbar bazbar 그러나 몇 가지 테스트 후 내 추론에 대해 틀릴 수 있지만 Dennis가 옳습니다
alex

3
@hendry 예, echo "foo bar" | (for i in `cat`; do echo ${i}bar; done)입력이 1 줄 임에도 불구하고 2 줄을 인쇄하는 등 공백이있는 줄에서는 실패합니다 foo bar( cat파일 대신 stdin에서 읽어도 차이가 없음).
hyde
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.