次のようなファイルがあります。
line1
line2
line3
そして私は取得したいです:
prefixline1
prefixline2
prefixline3
Rubyスクリプトを作成することもできますが、必要がない場合はそれをお勧めします。
prefix
含まれます/
。/opt/workdir/
たとえば、パスです。
次のようなファイルがあります。
line1
line2
line3
そして私は取得したいです:
prefixline1
prefixline2
prefixline3
Rubyスクリプトを作成することもできますが、必要がない場合はそれをお勧めします。
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
正常に完了します。
VimはExモードで使用できます。
ex -sc '%s/^/prefix/|x' file
%
すべての行を選択
s
取り替える
x
保存して閉じます
:%s/^/prefix/
これは、この戦略が多くの状況で役立つためです
シェルを使用する:
#!/bin/bash
prefix="something"
file="file"
while read -r line
do
echo "${prefix}$line"
done <$file > newfile
mv newfile $file
以下は、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
私はpierrにこの懸念があったとは思いませんが、複数のアラートログを同時に監視し、各行にそれぞれのログの名前を付けたいため、ファイルのライブ「テール」からの出力を遅延させないソリューションが必要でした。
残念ながら、sed、cutなどを使用すると、バッファリングが多くなりすぎて、最新の行を表示できなくなりました。の-s
オプションを使用するためのスティーブンペニーの提案nl
は興味をそそられ、テストによって、私に関係する不要なバッファリングが導入されないことが証明されました。
nl
ただし、不要な行番号を削除したいという要望に関連して、の使用にはいくつかの問題がありました(見た目を気にしなくても、余分な列の使用が望ましくない場合があります)。最初に、「カット」を使用して数値を取り除くと、バッファリングの問題が再び発生するため、ソリューションが破壊されます。次に、「-w1」を使用しても効果はありません。これは、行番号が1つの列に制限されないためです。必要な桁数が増えると、幅が広くなります。
これを別の場所にキャプチャしたい場合、それはきれいではありませんが、それはまさに私がする必要がなかったものだからです(すべてが既にログファイルに書き込まれていたので、リアルタイムでいくつかを一度に見たかっただけです)。行番号を失い、接頭辞のみを付ける方法は、-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
パラメータの展開を防ぐために、ヒアドキュメントの区切り文字( "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
このような軽量のタスクを好みます。「接頭辞」がわかっている場合、「接頭辞」以外の文字を選択するのは非常に簡単です。