답변:
매개 변수 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
sed -e 's/^/string after each line/' -i filename
$는 줄 끝을 의미합니다. ^는 줄의 시작을 의미합니다.
sed 's/^/string after each line/'
예상대로 수행하지만 (각 줄 앞에 추가) sed 's/^/string after each line/'
수행하지 않습니다 (전체 줄을 내 추가 문자열로 바꿉니다). 무엇을 제공합니까? @TomDeGisi 어떤 아이디어?
나는 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
NR
변수를 :awk '{print $0, NR}'
sed 's/ //g'
이것은 내 요구 사항에 적합했지만 모든 줄의 공간을 제거하므로 한 줄의 모든 옵션 g
이 있습니다.
,
좋아요 제거 {print $0"string to append after each line"}
.
순수 POSIX 쉘 및 sponge
:
suffix=foobar
while read l ; do printf '%s\n' "$l" "${suffix}" ; done < file |
sponge file
xargs
및 printf
:
suffix=foobar
xargs -L 1 printf "%s${suffix}\n" < file | sponge file
사용 join
:
suffix=foobar
join file file -e "${suffix}" -o 1.1,2.99999 | sponge file
쉘 도구를 사용하여 paste
, yes
, head
및 wc
:
suffix=foobar
paste file <(yes "${suffix}" | head -$(wc -l < file) ) | sponge file
앞에 탭 문자 를 paste
삽입합니다 .$suffix
물론 다른 답변과 마찬가지로 sponge
나중에 mv
원래 파일 이름 위에 임시 파일로 바꿀 수 있습니다 ...
sed
리소스가 매우 제한되지 않는 한 이들 중 어느 것도에게 선호 되지 않습니다.
sed
그런 간단한 일에는 필요하지 않습니다.
나는 선호한다 echo
. 순수 bash 사용 :
cat file | while read line; do echo ${line}$string; done
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
cat foo
; 에코 $ {i} bar; 완료 foobar barbar bazbar 그러나 몇 가지 테스트 후 내 추론에 대해 틀릴 수 있지만 Dennis가 옳습니다
echo "foo bar" | (for i in `cat`; do echo ${i}bar; done)
입력이 1 줄 임에도 불구하고 2 줄을 인쇄하는 등 공백이있는 줄에서는 실패합니다 foo bar
( cat
파일 대신 stdin에서 읽어도 차이가 없음).
touch
임시 파일입니까? 그리고 나는sed
명령의 성공을 조건부로 만들cp
거나 원본을 잃을 수 있습니다.