Programing

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

lottogame 2020. 3. 14. 10:01
반응형

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


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

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

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

Perl (교체) :

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

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

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

  2. s 바꾸다

  3. x 저장하고 닫습니다


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

prefix=path/to/file/

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

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

Perl이있는 경우 :

perl -pe 's/^/PREFIX/' input.file

쉘 사용하기 :

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

pierr가 이러한 우려를 가지고 있다고 생각하지는 않지만 파일의 라이브 "꼬리"에서 출력을 지연시키지 않는 솔루션이 필요했습니다. 여러 경고 로그를 동시에 모니터링하고 각 줄 앞에 해당 로그 이름을 붙이고 싶었 기 때문입니다. .

불행히도, 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}

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

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접근 방식을 사용하여 마무리 된 예제는 다음과 같습니다 .

$ 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

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

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

... 모든 파일, 각 파일에 exec lam을 찾아 각 파일에 고유 한 파일 이름 접두사를 지정합니다. (그리고 검색을 위해 출력을 fzf로 펌핑하십시오.)

참고 URL : https://stackoverflow.com/questions/2099471/add-a-prefix-string-to-beginning-of-each-line

반응형