416

以下のようなファイルがあります。

line1
line2
line3

そして、私は取得したい:

prefixline1
prefixline2
prefixline3

Ruby スクリプトを作成することもできますが、その必要がない方がよいでしょう。

prefixが含まれます//opt/workdir/たとえば、パスです。

4

18 に答える 18

639
# 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/'
于 2010-01-20T06:38:38.983 に答える
140
awk '$0="prefix"$0' file > new_file

awk では、デフォルトのアクションは'{print $0}'(つまり、行全体を出力する) であるため、上記は次と同等です。

awk '{print "prefix"$0}' file > new_file

Perl の場合 (インプレース置換):

perl -pi 's/^/prefix/' file
于 2010-01-20T06:41:22.250 に答える
34

ExモードでVimを使用できます:

ex -sc '%s/^/prefix/|x' file
  1. %すべての行を選択

  2. s交換

  3. x保存して閉じます

于 2012-09-30T16:18:00.460 に答える
26

プレフィックスが少し複雑な場合は、変数に入れてください。

prefix=path/to/file/

次に、その変数を渡し、awk に処理させます。

awk -v prefix="$prefix" '{print prefix $0}' input_file.txt
于 2015-02-17T21:35:11.447 に答える
6

シェルの使用:

#!/bin/bash
prefix="something"
file="file"
while read -r line
do
 echo "${prefix}$line"
done <$file > newfile
mv newfile $file
于 2010-01-20T07:05:30.400 に答える
5

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}
于 2014-03-07T21:44:09.897 に答える
2

この回答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
于 2016-03-16T13:24:46.853 に答える