각 줄의 시작 부분에 접두사 문자열 추가


334

아래와 같은 파일이 있습니다.

line1
line2
line3

그리고 나는 얻고 싶다 :

prefixline1
prefixline2
prefixline3

루비 스크립트를 작성할 수는 있지만 필요하지 않은 것이 좋습니다.

prefix포함합니다 /. /opt/workdir/예를 들어 경로 입니다.

답변:


526
# 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/'

1
@ benjamin, 나는 당신의 대답을 이미 찬성했지만, 나는 sed이것과 같은 가벼운 작업을 선호 합니다. "접두사"가 알려진 경우 "접두사"가 아닌 문자를 쉽게 선택할 수 있습니다.
Alok Singhal

1
sed파이프 라인 에서도 사용할 수 있습니다 ( 예 :) foo | sed -e 's/^/x /' | bar.
zigg

1
@ 데이터 맨 멋지다. 또 다른 방법은입니다 sed -e '2,$s/^/prefix/'.
Alok Singhal

1
@BinChen /\/(작은 따옴표로 묶인 문자열에서) 또는 \\/(큰 따옴표로 묶인 문자열에서)

8
sed -e 's/$/postfix/' file각 줄의 끝에 문자열을 추가 하려면 사용하십시오 .
Brian

121
awk '$0="prefix"$0' file > new_file

Perl (교체) :

perl -pi 's/^/prefix/' file

8
파이프 / 스트림 또는 변수 사용 :prtinf "$VARIABLE\n" | awk '$0="prefix"$0'
ThorSummoner

2
큰 파일 (12G)을 사용하면 awk보고 awk: out of memory in readrec 1 source line number 1하지만 솔루션이 sed성공적으로 완료됩니다.
jrm

33

Ex 모드에서 Vim을 사용할 수 있습니다 :

ex -sc '%s/^/prefix/|x' file
  1. % 모든 줄을 선택하십시오

  2. s 바꾸다

  3. x 저장하고 닫습니다


1
나를 위해, 난 그냥 정력 및 형식 파일을 열 :%s/^/prefix/이 전략은 많은 상황에서 유용한 끝부터
프랭크 브라이스

23

접두사가 조금 복잡하면 변수에 넣으십시오.

prefix=path/to/file/

그런 다음 해당 변수를 전달하고 awk가 처리하도록하십시오.

awk -v prefix="$prefix" '{print prefix $0}' input_file.txt


6

쉘 사용하기 :

#!/bin/bash
prefix="something"
file="file"
while read -r line
do
 echo "${prefix}$line"
done <$file > newfile
mv newfile $file

5

다음은 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

'ts'는 많은 Linux 배포판에 기본적으로 설치되지 않습니다. 또한이 답변에서 후행 "tr -d ''"가 'ts'에 의해 추가 된 공간뿐만 아니라 줄에서 모든 공백을 제거하므로 다운 보트
Tim Bird

3

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}

1
-u버퍼링을 피하려면 sed 옵션을 사용하십시오 .
Bryan Larsen

2
버퍼링은 unbuffer / stdbuf로 끌 수 있습니다. unix.stackexchange.com/q/25372/6205
myroslav

2

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 스크립트에 혹시 놀라움을 피하는 것이 좋습니다 .


2

& (패턴과 일치하는 입력의 전체 부분 사용) :

cat in.txt | sed -e "s/.*/prefix&/" > out.txt

또는 역 참조를 사용하는 경우 :

cat in.txt | sed -e "s/\(.*\)/prefix\1/" > out.txt

2
  1. 역 참조 기술을 사용하여이를 달성 할 수도 있습니다.

    sed -i.bak 's/\(.*\)/prefix\1/' foo.txt
    
  2. 이처럼 awk와 함께 사용할 수도 있습니다.

    awk '{print "prefix"$0}' foo.txt > tmp && mv tmp foo.txt
    

1

이 답변sed접근 방식을 사용하여 마무리 된 예제는 다음과 같습니다 .

$ cat /path/to/some/file | prefix_lines "WOW: "

WOW: some text
WOW: another line
WOW: more text

prefix_lines

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

2
PREFIX슬래시처럼 sed에 특수한 문자 가 포함되어 있으면 작동하지 않습니다 .
josch

좋은 점 ... 슬래시를 많이 사용하는 경우 여기설명 된대로 sed 부분에 다른 구분 기호 를 사용하면 검색에 사용할 수 있습니다. 다른 특수 sed 문자는 슬래시로 빠져 나갈 수 있습니다. 예 :prefix_lines \*
Brad Parks

0

BSD / OSX 시스템 사용자 lam에게는 라미네이트의 약어 인 유틸리티가 있습니다. lam -s prefix file당신이 원하는 것을 할 것입니다. 파이프 라인에서 사용합니다. 예 :

find -type f -exec lam -s "{}: " "{}" \; | fzf

... 모든 파일을 찾고, 각 파일에 exec lam을 붙여 각 파일에 고유 한 파일 이름을 붙입니다. (그리고 검색을 위해 출력을 fzf로 펌핑하십시오.)


당신이 옳습니다, 이것이 BSD 전용 명령 인 것 같습니다. POSIX는 그것을 페이스트로 대체했지만 페이스트에는 전체 구분자 문자열을 추가하는 기능이 없습니다. 답변을 업데이트하겠습니다.
Ray
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.