如何使用 vim 和插件快速为所有行添加 html 属性和值?

How to add html attributes and values for all lines quickly with vim and plugins?

我的os:debian8.

uname -a
Linux debian 3.16.0-4-amd64 #1 SMP Debian 3.16.39-1+deb8u2 (2017-03-07) x86_64 GNU/Linux

这是我的基础文件。

home 
help 
variables 
compatibility 
modelines 
searching 
selection 
markers 
indenting 
reformatting 
folding 
tags 
makefiles 
mapping 
registers 
spelling 
plugins 
etc

我想创建一个 html 文件,如下所示。

<a href="home.html" id="home">home</a>
<a href="help.html" id="help">help</a>
<a href="variables.html" id="variables">variables</a>
<a href="compatibility.html" id="compatibility">compatibility</a>
<a href="modelines.html" id="modelines">modelines</a>
<a href="searching.html" id="searching">searching</a>
<a href="selection.html" id="selection">selection</a>
<a href="markers.html" id="markers">markers</a>
<a href="indenting.html" id="indenting">indenting</a>
<a href="reformatting.html" id="reformatting">reformatting</a>
<a href="folding.html" id="folding">folding</a>
<a href="tags.html" id="tags">tags</a>
<a href="makefiles.html" id="makefiles">makefiles</a>
<a href="mapping.html" id="mapping">mapping</a>
<a href="registers.html" id="registers">registers</a>
<a href="spelling.html" id="spelling">spelling</a>
<a href="plugins.html" id="plugins">plugins</a>
<a href="etc.html" id="etc">etc</a>

每一行都添加了href和id属性,其值为粘贴的行内容.html和行内容本身对应。

如何使用 vim 和插件为所有行快速添加 html 属性和值?
欢迎sed,awk,sublime text 3解决问题

$ sed 's:.*:<a href="&.html" id="&">&</a>:' file
<a href="home.html" id="home">home</a>
<a href="help.html" id="help">help</a>
<a href="variables.html" id="variables">variables</a>
<a href="compatibility.html" id="compatibility">compatibility</a>
<a href="modelines.html" id="modelines">modelines</a>
<a href="searching.html" id="searching">searching</a>
<a href="selection.html" id="selection">selection</a>
<a href="markers.html" id="markers">markers</a>
<a href="indenting.html" id="indenting">indenting</a>
<a href="reformatting.html" id="reformatting">reformatting</a>
<a href="folding.html" id="folding">folding</a>
<a href="tags.html" id="tags">tags</a>
<a href="makefiles.html" id="makefiles">makefiles</a>
<a href="mapping.html" id="mapping">mapping</a>
<a href="registers.html" id="registers">registers</a>
<a href="spelling.html" id="spelling">spelling</a>
<a href="plugins.html" id="plugins">plugins</a>
<a href="etc.html" id="etc">etc</a>

要在 Sublime Text 中轻松完成此操作,无需添加任何插件:

  1. 在 Sublime Text 中打开基础文件
  2. 键入 Ctrl+Shift+P 并在模糊搜索输入中键入 syn html 以将文件语法设置为 HTML.
  3. View 菜单中,确保 Word Wrap 已关闭。
  4. Ctrl+A 到 select 全部。
  5. Ctrl+Shift+L 将 selection 分成多行编辑。
  6. Ctrl+C 将 selection 作为多行复制到剪贴板。
  7. Alt+Shift+W 用标签包裹每一行——然后点击 a 将默认的 <p> 标签转换为 <a> 标签(点击 esc 退出任何可能弹出的上下文菜单)
  8. 键入 space 然后 href=" -- 你应该看到它被添加到每一行,因为它们都有光标。另外你应该注意到 Sublime 已经自动为你关闭你的引号,所以你有 href="" 并且光标在引号之间。
  9. ctrl+v -- 这就是魔法发生的地方 -- 您的剪贴板包含每一行有价值的内容,因此它会将每个适当的值粘贴到光标所在的引号中。然后您只需键入 .html 即可添加扩展名。
  10. 使用向右箭头将光标移到 href 属性的引号外,然后按照前面两个步骤类似地添加具有预期 idid 属性已粘贴。
  11. 瞧!大功告成。

多行编辑 非常 强大,因为您学习了如何将它与其他键盘快捷键结合使用。这对我的工作流程来说是一个巨大的改进。如果您有任何问题,请随时发表评论,我会根据需要进行调整。

试试这个 -

awk '{print abcd}' a='<a href="' b='.html" id="' c='">' d='</a>' file
<a href="home.html" id="home">home</a>
<a href="help.html" id="help">help</a>
<a href="variables.html" id="variables">variables</a>
<a href="compatibility.html" id="compatibility">compatibility</a>
<a href="modelines.html" id="modelines">modelines</a>
<a href="searching.html" id="searching">searching</a>
<a href="selection.html" id="selection">selection</a>
<a href="markers.html" id="markers">markers</a>
<a href="indenting.html" id="indenting">indenting</a>
<a href="reformatting.html" id="reformatting">reformatting</a>
<a href="folding.html" id="folding">folding</a>
<a href="tags.html" id="tags">tags</a>
<a href="makefiles.html" id="makefiles">makefiles</a>
<a href="mapping.html" id="mapping">mapping</a>
<a href="registers.html" id="registers">registers</a>
<a href="spelling.html" id="spelling">spelling</a>
<a href="plugins.html" id="plugins">plugins</a>
<a href="etc.html" id="etc">etc</a>

我在这里创建了 4 个变量 a、b、c 和 d,您可以根据自己的选择进行编辑。

while read -r i;do echo  "<a href=\"$i.html\" id=\""$i"\">"$i</a>";done < f
<a href="home.html" id="home">home</a>
<a href="help.html" id="help">help</a>
<a href="variables.html" id="variables">variables</a>
<a href="compatibility.html" id="compatibility">compatibility</a>

如果您对内容有把握,sed 是最好的解决方案(这里简单且非常快速),否则它需要一点复杂性,awk 可以更好地处理它:

awk '
   {
   # change special char for HTML constraint 
   Org = URL = HTML = [=10=]
   # sample of modification
   gsub( / /, "%20", URL)
   gsub( /</, "%3C", HTML)

   printf( "<a href=\"%s\" id=\"%s\">%s</a>\n", URL, Org, HTML)
   }
   ' YourFile

使用 bash 一行:

while read v; do printf '<a href="%s.html" id="%s">%s</a>\n' "$v" "$v" "$v"; done < file

(或)

while read v; do echo "<a href=\"$v.html\" id=\"$v\">$v</a>"; done < file

在 awk 中,没有正则表达式,什么都没有,只有 print 字符串围绕 </code>s,转义 <code>"s:

$ awk '{print "<a href=\""  ".html\" id=\""  "\">"  "</a>"}' file
<a href="home.html" id="home">home</a>
<a href="help.html" id="help">help</a>

如果碰巧有空行,只需在 { 之前添加 /./

/./{print ...

直接在vim中执行:

!sed 's:.*:<a href="&.html" id="&">&</a>:' %

如果您想在 vi 本身执行此操作,则无需插件

打开文件,键入 : 并插入此行作为命令

%s:.*:<a href="&.html" id="&">&</a>

它将在文件中进行所有替换。

list=$(cat basefile.txt)
for val in $list
do
   echo "<a href=\""$val".html\" id=\""$val"\">"$val"</a>" >> newfile.html
done

使用 bash,您可以随时制作脚本或将其输入命令行。

此 vim 替换模式处理您的基本文件:

s#^\s*\(.\{-}\)\s*$#<a href=".html" id=""></a>#
  • ^\s* 匹配任何前导空格,然后
  • .\{-} 捕获之后的所有内容,非贪婪 — 允许
  • \s$ 以匹配任何尾随空格。
  • 这避免了给你 <a href="home .html" id="home ">home </a>.
  • 之类的东西

您还可以使用 vim 一次处理多个基本文件:

vim -c 'bufdo %s#^\s*\(.\{-}\)\s*$#<a href=".html" id=""></a># | saveas! %:p:r.html' some.txt more.txt`
  • bufdo %s#^\s*\(.\{-}\)\s*$#<a href=".html" id=""></a># 对加载到 vim、
  • 的每个缓冲区运行替换
  • saveas! %:p:r.html 使用 html 扩展名 保存每个缓冲区 ,必要时覆盖,
  • vim 将打开并显示已保存的 more.html,您可以根据需要进行更正,
  • 您可以使用:n:prev访问some.html

sed 之类的东西可能最适合大型作业,但这让您可以在 vim 中立即调整转换,使用 :u 撤消等。享受吧!