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


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.