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. xargs및 printf:

    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, head 및 wc:

    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.