1

sed in bashを使用して、次のようなテキストファイルの行を変更できることを知っています。

name = "applicationname" //これは問題ではありません(さまざまです。そのため、varを使用します)

描写: http: //google.com または描写:http://yahoo.com//描写の「値」が異なる場合があります

描写: http: //mysite.com/depiction.php? package =applicationname //これは私が達成したいフォーマットです

sedを使用しますが、sedの実装方法が完全にはわかりません。 http://www.gnu.org/software/sed/

編集:これは私がちょうど思いついたものです

sed -i "s!Depiction:.*!Depiction: http://mysite.com/depiction.php?package=$name!" ./inputfile

この特定のテキストファイルに「描写:」がない場合はどうなりますか?行を挿入するにはどうすればよいですか:描写: http: //mysite.com/depiction.php ?package = applicationname ?

4

5 に答える 5

1

次のように試すことができます。「Depiction:」のすべてのインスタンスを削除してから、必要な行を追加します

{
  grep -v "Depiction:" filename
  echo "Depiction: ..."
} > newfile && mv newfile filename
于 2012-04-09T17:10:25.650 に答える
1

私は何とか多くの試行錯誤で答えを思いつくことができました...だから共有するだけです。:)

if grep -Fq "Depiction:" ./file
then
sed -i "s!Depiction:.*!Depiction: http://mysite.com/depiction.php?package=$name" ./file
else
sed -i 1i"Depiction: http://mysite.com/depiction.php?package=$name" ./file
fi
于 2012-04-10T01:44:01.977 に答える
0

順序を気にしない場合は、削除してから追加します。またはawkを使用します:

awk 'BEGIN{replacement="Depiction: http://mysite.com/depiction.php?package=applicationname"}/^Depiction:/{print replacement;found=1}!/^Depiction:/{print}END{if(!found)print replacement}' < file

またはその他の高次言語。

于 2012-04-09T17:01:02.367 に答える
0

sedは、単純な置換に最も役立ちます。「見つからない場合はXを実行する」などのロジックができたら、より汎用的な言語に移行する必要があります。私はPythonが好きです:

from sys import argv, stdout

filename = argv[1]
depiction_found = False
for line in open(filename):
    line.replace('foo', 'bar') #I'm not too sure what you're really trying to do
    if line.startswith("Depiction: "):
        depiction_found = True
    stdout.write(line)

if not depiction_found:
    stdout.write("Depiction: <correct value here>\n")
于 2012-04-09T16:59:06.530 に答える
0

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

sed -i '/Depiction:.*/{h;s||Depiction: http://mysite.com/depiction.php?package='"$name"'|};$!b;x;/./{x;q};x;a\Depiction: http://mysite.com/depiction.php?package='"$name" ./inputfile

またはおそらく必要最低限​​のものとして:

sed -i '/foo/{h;s//FOO/};$!b;x;/./{x;q};x;a\FOO' file

本質的に:

  • 存在する場合fooは、ホールドスペース(HS)にコピーを作成し、置換を実行します。
  • ファイルの終わり($)で、証拠または以前の置換がないかホールドスペースを確認し、ない場合は行を追加します。
于 2012-04-09T20:35:48.550 に答える