5

コマンドを含むファイルを使用して、sedパイプ入力を変更できるプロセスがあります。

入力のプレースホルダーを変数値に置き換える必要があります。たとえば、実行できる単一の-eタイプのコマンドの場合です。

$ echo "Today is XX" | sed -e "s/XX/$(date +%F)/"
Today is 2012-10-11

ただし、ファイル内のアスペクトを指定することしかできませんsed(そして、プロセスをファイルに向けることができます)。たとえば、呼び出されたファイルには次のものreplacements.sedが含まれる場合があります。

s/XX/Thursday/

明らかに;

$ echo "Today is XX" | sed -f replacements.sed
Today is Thursday

ただし、環境変数またはシェル値を使用したい場合は、それを拡張する方法が見つかりません。たとえば、replacements.txtcontainsの場合などです。

s/XX/$(date +%F)/

それで;

$ echo "Today is XX" | sed -f replacements.sed
Today is $(date +%F)

ファイルのテキストに二重引用符を含めると、二重引用符が出力されます。

ファイルで変数を使用できるようにする方法を知っている人はいsedますか?

4

5 に答える 5

7

これはあなたのために働くかもしれません(GNU sed):

cat <<\! > replacements.sed
/XX/{s//'"$(date +%F)"'/;s/.*/echo '&'/e}
!
echo "Today is XX" | sed -f replacements.sed

GNU sedをお持ちでない場合は、以下をお試しください。

cat <<\! > replacements.sed
/XX/{
    s//'"$(date +%F)"'/
    s/.*/echo '&'/
}
!
echo "Today is XX" | sed -f replacements.sed | sh
于 2012-10-11T05:55:31.557 に答える
3

AFAIK、それは不可能です。あなたの最善の策は次のようになります:

入力ファイル

aaa
bbb
ccc

SHスクリプト

#!/bin/sh

STRING="${1//\//\\/}"   # using parameter expansion to prevent / collisions

shift

sed "
s/aaa/$STRING/
" "$@"

コマンドライン

./sed.sh "fo/obar" <file path>

出力

fo/obar
bbb
ccc
于 2012-10-11T01:48:27.973 に答える
2

他の人が言っているように、sedスクリプトで変数を使用することはできませんが、ホールドバッファーに追加される追加の先行入力を使用して、変数を「偽造」できる可能性があります。例えば:

[ghoti@pc ~/tmp]$ cat scr.sed 
1{;h;d;};/^--$/g
[ghoti@pc ~/tmp]$ sed -f scr.sed <(date '+%Y-%m-%d'; printf 'foo\n--\nbar\n')
foo
2012-10-10
bar
[ghoti@pc ~/tmp]$ 

この例では、プロセスリダイレクトを使用してsedに入力を取得しています。「重要な」データはによって生成されprintfます。代わりにファイルを作成するか、他のプログラムを実行することができます。「変数」はdateコマンドによって生成され、スクリプトへの入力の最初の行になります。

sedスクリプトは最初の行を取得し、それをsedの保留バッファーに入れてから、その行を削除します。次に、後続の行について、それが二重ダッシュ(「マクロ置換」)と一致する場合、ホールドバッファーの内容を置換します。そして、それがsedのデフォルトのアクションであるため、印刷します。

ホールドバッファ(g、G、h、H、およびxコマンド)は、「高度な」sedプログラミングを表します。しかし、それらがどのように機能するかを理解すると、sedfuの新しい次元が開かれます。

注:このソリューションは、行全体を置き換えるのに役立ちます。行内の部分文字列を置換することは、ホールドバッファを使用して可能かもしれませんが、それを行う方法を想像することはできません。

(別の注意:これは、Linuxで見られるものとは異なるsedを使用するFreeBSDで行っています。これは、GNU sedで機能する場合と機能しない場合があります。テストしていません。)

于 2012-10-11T02:55:08.593 に答える
0

私はsputnickに同意します。sedがそのタスクを完了することができるとは思わない。

ただし、そのファイルをその場で生成することはできます。

日付を。のような固定文字列に変更できます __DAYOFWEEK__

一時ファイルを作成し、sedを使用__DAYOFWEEK__して。に置き換え$(date +%Y)ます。

次に、ファイルを。で解析しますsed -f $TEMPFILE

sedは素晴らしいですが、その場で日付を生成できるperlのようなものを使用する時期かもしれません。

于 2012-10-11T02:02:02.850 に答える
0

sedファイルを使用して置換式に改行を追加するために、最終的に機能したのは、リテラルの改行をエスケープすることです。例:文字列NewLineHereの後に改行を追加すると、これでうまくいきました。

#! /usr/bin/sed -f
s/NewLineHere/NewLineHere\
/g

それが重要かどうかはわかりませんが、私はSolaris unixを使用しているので、GNUsedは確かではありません。

于 2019-08-06T14:01:18.437 に答える