아래와 같은 파일이 있습니다.
line1
line2
line3
그리고 나는 얻고 싶다 :
prefixline1
prefixline2
prefixline3
루비 스크립트를 작성할 수는 있지만 필요하지 않은 것이 좋습니다.
prefix
포함합니다 /
. /opt/workdir/
예를 들어 경로 입니다.
아래와 같은 파일이 있습니다.
line1
line2
line3
그리고 나는 얻고 싶다 :
prefixline1
prefixline2
prefixline3
루비 스크립트를 작성할 수는 있지만 필요하지 않은 것이 좋습니다.
prefix
포함합니다 /
. /opt/workdir/
예를 들어 경로 입니다.
답변:
# If you want to edit the file in-place
sed -i -e 's/^/prefix/' file
# If you want to create a new file
sed -e 's/^/prefix/' file > file.new
경우 prefix
포함 /
, 당신은하지의 다른 문자를 사용할 수 있습니다 prefix
, 또는 탈출 /
소위, sed
명령이된다
's#^#/opt/workdir#'
# or
's/^/\/opt\/workdir/'
sed
파이프 라인 에서도 사용할 수 있습니다 ( 예 :) foo | sed -e 's/^/x /' | bar
.
sed -e '2,$s/^/prefix/'
.
sed -e 's/$/postfix/' file
각 줄의 끝에 문자열을 추가 하려면 사용하십시오 .
awk '$0="prefix"$0' file > new_file
Perl (교체) :
perl -pi 's/^/prefix/' file
prtinf "$VARIABLE\n" | awk '$0="prefix"$0'
awk
보고 awk: out of memory in readrec 1 source line number 1
하지만 솔루션이 sed
성공적으로 완료됩니다.
다음은 moreutils의 ts
명령을 사용하여 읽기 쉬운 oneliner 솔루션입니다.
$ cat file | ts prefix | tr -d ' '
그리고 그것이 단계별로 파생되는 방법 :
# Step 0. create the file
$ cat file
line1
line2
line3
# Step 1. add prefix to the beginning of each line
$ cat file | ts prefix
prefix line1
prefix line2
prefix line3
# Step 2. remove spaces in the middle
$ cat file | ts prefix | tr -d ' '
prefixline1
prefixline2
prefixline3
pierer가 이러한 우려를 가지고 있다고 생각하지는 않지만 파일의 라이브 "꼬리"에서 출력을 지연시키지 않는 솔루션이 필요했습니다. 여러 경고 로그를 동시에 모니터링하고 각 줄 앞에 해당 로그 이름을 붙이고 싶었 기 때문입니다. .
불행히도, sed, cut 등은 버퍼링을 너무 많이 도입하여 최신 라인을 보지 못했습니다. -s
옵션 을 사용하겠다는 Steven Penny의 제안 nl
은 흥미 로웠으며 테스트 결과 나에게 관심이있는 원치 않는 버퍼링이 도입되지 않았다는 것이 입증되었습니다.
nl
그러나 원치 않는 줄 번호를 제거하려는 욕구와 관련하여을 사용하는 데 몇 가지 문제가있었습니다 (미학에 신경 쓰지 않아도 여분의 열을 사용하는 것이 바람직하지 않은 경우가 있습니다). 첫째, "잘라 내기"를 사용하여 숫자를 제거하면 버퍼링 문제가 다시 발생하여 솔루션이 손상됩니다. 둘째, "-w1"을 사용하면 행 번호를 단일 열로 제한하지 않기 때문에 도움이되지 않습니다. 더 많은 숫자가 필요할수록 넓어집니다.
당신이 이것을 다른 곳에서 캡처하고 싶다면 그것은 좋지 않지만, 그것은 내가 할 필요가 없었기 때문에 (모든 것이 이미 로그 파일에 기록되고 있었기 때문에 한 번에 여러 개를 실시간으로보고 싶었습니다), 최고 줄 번호를 잃고 접두사 만 -s
있는 방법은 캐리지 리턴 (CR 또는 ^ M 또는 Ctrl-M)으로 문자열 을 시작하는 것 입니다. 예를 들어 :
#!/bin/ksh
# Monitor the widget, framas, and dweezil
# log files until the operator hits <enter>
# to end monitoring.
PGRP=$$
for LOGFILE in widget framas dweezil
do
(
tail -f $LOGFILE 2>&1 |
nl -s"^M${LOGFILE}> "
) &
sleep 1
done
read KILLEM
kill -- -${PGRP}
-u
버퍼링을 피하려면 sed 옵션을 사용하십시오 .
ed 사용하기 :
ed infile <<'EOE'
,s/^/prefix/
wq
EOE
각 라인에 대한 대체품이, ( ,
), 라인 (초 ^
)와 prefix
. wq
저장하고 종료합니다.
교체 문자열에 슬래시가 포함 된 경우 다른 구분 기호를 s
대신 사용할 수 있습니다 .
ed infile <<'EOE'
,s#^#/opt/workdir/#
wq
EOE
EOE
파라미터 확장을 막기 위해 here-doc 구분 기호 ( "end of ed")를 인용했습니다 . 이 예제에서는 인용 부호없이 작동하지만 $
ed 스크립트에 혹시 놀라움을 피하는 것이 좋습니다 .
역 참조 기술을 사용하여이를 달성 할 수도 있습니다.
sed -i.bak 's/\(.*\)/prefix\1/' foo.txt
이처럼 awk와 함께 사용할 수도 있습니다.
awk '{print "prefix"$0}' foo.txt > tmp && mv tmp foo.txt
이 답변 의 sed
접근 방식을 사용하여 마무리 된 예제는 다음과 같습니다 .
$ cat /path/to/some/file | prefix_lines "WOW: "
WOW: some text
WOW: another line
WOW: more text
function show_help()
{
IT=$(CAT <<EOF
Usage: PREFIX {FILE}
e.g.
cat /path/to/file | prefix_lines "WOW: "
WOW: some text
WOW: another line
WOW: more text
)
echo "$IT"
exit
}
# Require a prefix
if [ -z "$1" ]
then
show_help
fi
# Check if input is from stdin or a file
FILE=$2
if [ -z "$2" ]
then
# If no stdin exists
if [ -t 0 ]; then
show_help
fi
FILE=/dev/stdin
fi
# Now prefix the output
PREFIX=$1
sed -e "s/^/$PREFIX/" $FILE
PREFIX
슬래시처럼 sed에 특수한 문자 가 포함되어 있으면 작동하지 않습니다 .
prefix_lines \*
BSD / OSX 시스템 사용자 lam
에게는 라미네이트의 약어 인 유틸리티가 있습니다. lam -s prefix file
당신이 원하는 것을 할 것입니다. 파이프 라인에서 사용합니다. 예 :
find -type f -exec lam -s "{}: " "{}" \; | fzf
... 모든 파일을 찾고, 각 파일에 exec lam을 붙여 각 파일에 고유 한 파일 이름을 붙입니다. (그리고 검색을 위해 출력을 fzf로 펌핑하십시오.)
sed
이것과 같은 가벼운 작업을 선호 합니다. "접두사"가 알려진 경우 "접두사"가 아닌 문자를 쉽게 선택할 수 있습니다.