更改文本文件中的行(如果存在)

时间:2012-04-09 16:53:08

标签: linux bash replace sed line

我知道你可以使用bash中的sed更改文本文件中的一行,显示类似的内容;

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

5 个答案:

答案 0 :(得分:1)

您可以这样尝试:删除“描述:”的所有实例,然后追加您想要的行

{
  grep -v "Depiction:" filename
  echo "Depiction: ..."
} > newfile && mv newfile filename

答案 1 :(得分: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

答案 2 :(得分: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")

答案 3 :(得分: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

或任何其他高阶语言。

答案 4 :(得分: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)中复制并执行替换。
  • 在文件末尾($),检查保留空间是否有证据或先前的替换,如果没有,则附加一行。