2017-04-02 5 views
-2

私はsedについて学んできましたが、これは非常に便利ですが、多くのガイドや例でこれを見つけることができません...ファイル名をテキストファイルのパスと拡張子を除いたテキストファイルをテキスト内の特定の行に挿入します。可能?sedでテキストファイルにファイル名を挿入

+0

環境に関する詳細情報を提供することをお勧めします。私は、シェル変数の置換を介してソリューションの提案を予測します。だから、使用しているシェルの種類を明記してください。また、他の情報も参考になるかもしれません(http://stackoverflow.com/help/mcve)。 – Yunnosch

+0

はい、申し訳ありません。 Linux Ubuntu 16.04.2とGNU sed 4.2.2 – raysa

答えて

1

このような場合、正しい開始点はマニュアルページである必要があります。 sedのマニュアルにはsedが "filename"を理解する機能はありませんが、sedは行の前後にテキストを挿入する機能をサポートしています。

結果として、ファイル名を別々に分離し、テキストを変数に格納して、このテキストを必要な行の前/後に挿入する必要があります。

例:

説明
$ a="/home/gv/Desktop/PythonTests/cpu.sh" 
$ a="${a##*/}";echo "$a" 
cpu.sh 
$ a="${a%.*}"; echo "$a" 
cpu 

$ cat file1 
LOCATION 0 X 0 
VALUE 1a 2 3 
VALUE 1b 2 3 
VALUE 1c 2 3 

$ sed "2a $a" file1 # Inject the contents of variable $a after line2 
LOCATION 0 X 0 
VALUE 1a 2 3 
cpu 
VALUE 1b 2 3 
VALUE 1c 2 3 

$ sed "2i $a" file1 # Inject the contetns of variable $a before line2 
LOCATION 0 X 0 
cpu 
VALUE 1a 2 3 
VALUE 1b 2 3 
VALUE 1c 2 3 

$ sed "2a George" file1 #Inject a fixed string "George" after line 2 
LOCATION 0 X 0 
VALUE 1a 2 3 
George 
VALUE 1b 2 3 
VALUE 1c 2 3 


a="${a##*/}"は:の終わりから始まるすべての文字を削除します。見つけスラッシュ/(長い試合)
a="${a%.*}"を最後までの文字列の先頭からすべての文字を削除します。最初に見つかった点までの文字列。 (ショートマッチ)。また、見つかった最も長いドットに%%を使用することもできます。
sed "2a $a"は:ライン2変数の内容の後に挿入は
sed "2i $q" $:ライン2の前にあなたは、プロセスの下でファイル内のインプレース変更を/作るためにsed -iを使用することができます必要に応じて$

の内容を挿入

1

wrt I've been learning about sedあなたは、s/old/newを超えてsedについて学ぶべきことがたくさんあるので、あなたの時間を無駄にしているかもしれません。確かに他にもたくさんの言語構造とsedでできることがありますが、実際にはそれらをすべて避けて、代わりにawkを使うだけです。あなたの質問を簡潔でテスト可能なサンプル入力と予想される出力を含めるように編集し、awkタグを追加すると、正しい方法で何をしたいのかを示すことができます。

あなたが必要とするすべてがあるように一方、それが聞こえる:

$ cat /usr/tmp/file 
a 
b 
c 
d 
e 

$ awk 'NR==3{print gensub(/.*\//,"",1,FILENAME)} 1' /usr/tmp/file 
a 
b 
file 
c 
d 
e 

上記は、開いているファイルの3行目の前に現在のファイル名を挿入します。これはgensub()にGNU awkを使用し、sub()と変数だけを使用する他のawksを使用します。

+0

良い点がありますが、ファイル名拡張子(接尾辞)の削除がありません。 – mklement0

+0

OPが提供するサンプル入出力の種類を確認します。 –

+1

いつでも今すぐ。 :) – mklement0

関連する問題