SED 在 htaccess 上进行数千次 301 重定向?

SED 在 htaccess 上进行数千次 301 重定向?

在我的一个网站上更改 URL 后,我对 URL 感到头疼。 URL 非常长,尽管后来通过 .htacces 进行了更改,但我还是决定更改它们...

我正在一一进行更改(我有超过 1500 个 URL...)

我有这个:

Redirect 301 /noticies/festes-noticies/diania-roda-les-aixames-la-nit-de-nadal/

这变成:

Redirect 301 /noticies/festes-noticies/diania-roda-les-aixames-la-nit-de-nadal/ /diania-roda-les-aixames-la-nit-de-nadal/

最后一个/-----/, 放在行的末尾,有一个空格。

有一种使用 sed 或其他命令的方法可以轻松地做到这一点吗?

答案1

使用sed

< input_file sed -E 's#((/[^/]*){2})$#\1 \1#' > output_file
  • /[^/]*匹配斜杠后跟零个或多个不带斜杠的字符。
  • (){2}表示将表达式放入括号两次。
  • $匹配行尾。
  • 外部()允许将内部的东西重新用于\1替换部件。
  • #为了方便起见,还使用与斜杠不同的字符(例如)作为此替换中的分隔符。并-E启用 ERE。

答案2

sed强制性的 ?

awk -F/ '{printf "%s /%s/\n",$0,$(NF-1)}' old_file > new_file

仅适用于重定向行并重写完整文件。

awk -F/ '$1 ~ /Redirect/ {printf "%s /%s/\n",$0,$(NF-1); next ; } {print}' old_file > new_file

在哪里

  • -F/告诉 awk 用作/字段分隔符
  • $0,$(NF-1)是整行,在最后一个字段之前
  • $1 ~ /Redirect/选择带有重定向的行
  • next转到下一行
  • {print}隐式打印行不匹配Redirect

编辑:如果原始行以尾随结尾/,我们需要选择最后一个字段之前的字段。


注意有些awk可以就地编辑(awk -i);但是我建议您保留原始文件并将版本应用到新文件,如果您对结果满意则重命名它。

相关内容