精华内容
下载资源
问答
  • 正则表达式与文本格式化处理

    千次阅读 2015-10-26 15:43:31
    格式化输出时,在 printf 的格式设定当中,务必加上 \n ,才能进行分行!  不 bash shell 的变量不同,在 awk 当中,变量可以直接使用不需加上 $ 符号。 文件的比较工具 通常同一个软件的不同...

    正则表达式是通过一些特殊字符的排列,用以查找、替换、删除一行或多行文字字符串,简单地说,正则表达式就是用在字符串处理上面的一项“表示式”。正则表达式不是一个工具程序,二是一种字符处理的标准依据。

    12.1前言:什么是正则表达式

    正则表达式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以让用户轻易达到查找删除替换某特定字符串的处理程序。



    12.2基础正则表达式


    用dmesg列出内核信息,再以grep找出内含eth的哪行

    dmesg | grep ‘eth’

    dmesg |grep -n --color=auto ’eth‘

    dmesg |grep -n -A3 -B2 --color=auto 'eth'


    grep在数据中查找一个字符串时,是以整行为单位来进行数据的选取的

    alias grep=’grep --color=auto‘

    再以source ~./bashrc来立即生效即可


    grep练习:

    查找特定字符串

    -n显示行号


    -v反向选择


    -i忽视大小写



    利用中括号[]查找集合字符















    行首与行尾字符^$













    grep -n '^$' cyf.txt找出空行


    匹配一个字符.与重复字符*

    .(小数点):代表一定有一个任意字符的意思

    *(星号):代表重复前一个0到无穷多次的意思,为组合形态








    限定连续RE字符范围{}





    正则表达式的字符







    sed工具

    sed本身也是一个管道命令,可以分析standard input的,而且sed还可以将数据进行替换、删除、新增、选定特定行等功能



    以行为单位的新增、删除功能

    #将/etc/passwd的内容列出并且打印行号,同时,删除2-5行
    nl /etc/passwd |grep '2,5d'
    #在第二行后加上'drink tea'
    nl /etc/passwd |sed '2a drink tea'




    以行为单位的替换与现实功能




    sed 's/要被替换的字符串/新的字符串/g'









    直接修改文件内容(危险操作)

    利用 sed 将 regular_express.txt 内每一行结尾若为 . 则换成 !

    sed -i 's/\.$/\!/g' cyf.txt 

    利用 sed 直接在 regular_express.txt 最后一行加入『# This is a test』

    sed -i '$a # This is a test' regular_express.txt

    12.3扩展正则表达式



    12.4文件的格式化与相关处理


    格式化打印:printf




    awk:好用的数据处理工具

    awk也还一个非常棒的数据处理工具。相比于sed常常作用域一整行的处理,awk则比较倾向于将一行分成数据“字段”来处理

    awk适合处理小型的数据处理

    格式:

    awk '条件类垄1{劢作1} 条件类垄2{劢作2} ...' filename





    整个awk的处理流程:

    读入第一行,并将第一行的数据填入$0,$!,$2等变量当中;

    依据条件类型的限制,判断是否需要进行后面的动作

    做完所有的动作与条件类型

    若还有后续的行的数据,则重复上面1-3的步骤指导所有的数据都度完为止

    awk是以行为一次处理的单位,而以字段为最小的处理单位。





    awk的逻辑运算符



    在 /etc/passwd 当中是以冒号 ":" 来作为字段的分隔, 该档案中第一字段为账号,第三字段则是 UID。那假设我要查阅,第三栏小于 10 以下的数据,并且仅列出账号不第三栏,


    为什么第一行没有正确显示?因为我们读入第一行的时候,那些变量$!,$2默认还是以空格为分割的,所以虽然我们定义了FS=“:”,但是却仅能在第二行后才开始生效。





     awk 的指令间隔:所有 awk的动作,即在 {} 内的动作,如果有需要多个指令辅助时,可利用分号『;』间隔, 或者直接以 [Enter] 按键杢隔开每个指令,例如上面的范例中,鸟哥共按了三次 [enter] 喔!
     逻辑运算当中,如果是『等于』的情况,则务必使用两个等号『==』!
     格式化输出时,在 printf 的格式设定当中,务必加上 \n ,才能进行分行!
     不 bash shell 的变量不同,在 awk 当中,变量可以直接使用不需加上 $ 符号。


    文件的比较工具

    通常同一个软件的不同版本之间,比较配置文件与源文件的区别。很多时候所谓的文件的比较,通常是用在ASCII纯文本文件的比较上。

    比较的命令diff

    可以通过cmp比较非纯文本文件,同时也能够通过diff创建分析文件

    diff

    diff就是用在比较两个文件之间的区别的,并且是以行为单位来比较的,一般是用ASCII纯文本文件的比较上。由于是一行为单位比较的单位,因此diff通常是用在同一的文件(或软件)的新旧版本区别上



    cmp

    cmp主要也是比较两个文件,它主要利用字节单位去比较。因此当然也可以比较二进制文件



    patch

    patch这个命令与diff可是密不可分的

    diff是比较两个版本之间的区别

    如果升级呢?就是将旧的文件升级为新的文件时应该怎么做?

    就是先比较新旧版本的区别,并将区别文件制作称为补丁文件,在由补丁文件更新旧文件即可。


    cp /etc/passwd /home/cyf/sh/passwd.old
    cat /home/cyf/sh/passwd.old |sed -e '4d' -e '6c no six line' >passwd.new
    

    一般使用diff制作出来的比较文件通常使用扩展名。patch

    新文件看到-会删除,看到+会加入

    更新新旧数据

    还原旧文件的内荣



    文件打印准备:pr




    展开全文
  • 取得选中的列的文本值ddl.options[ddl.selectedIndex].innerText 取得选中值相对应的valueddl.options[ddl.selectedIndex].value获取索引var selectIndex=document.getElementById("DropDownList1").selected

     
    1.文本框焦点问题
    onBlur:当失去输入焦点后产生该事件
    onFocus:当输入获得焦点后,产生该文件
    Onchange:当文字值改变时,产生该事件
    Onselect:当文字加亮后,产生该文件

    <input type="text" value="郭强" οnfοcus="if(value=='郭强') {value=''}" οnblur="if
    (value=='') {value='郭强'}">点击时文字消失,失去焦点时文字再出现


    2.网页按钮的特殊颜色
    <input type=button name="Submit1" value="郭强" size=10 class=s02

    style="background-color:rgb(235,207,22)">

    3.鼠标移入移出时颜色变化
    <input type="submit" value="找吧" name="B1" onMouseOut=this.style.color="blue"

    onMouseOver=this.style.color="red"  class="button">

    4.平面按钮
    <input type=submit value=订阅 style="border:1px solid :#666666; height:17px; width:25pt; font-size:9pt;

    BACKGROUND-COLOR: #E8E8FF; color:#666666" name="submit">

    5.按钮颜色变化
    <input type=text name="nick"  style="border:1px solid #666666;  font-size:9pt;  height:17px;

    BACKGROUND-COLOR: #F4F4FF; color:#ff6600" size="15" maxlength="16">

    6.平面输入框
    <input type="text" name="T1" size="20" style="border-style: solid; border-width: 1">

    7.使窗口变成指定的大小
    <script>
    window.resizeTo(300,283);
    </script>

    8.使文字上下滚动
    <marquee direction=up scrollamount=1 scrolldelay=100 οnmοuseοver='this.stop()' οnmοuseοut='this.start()'

    height=60>
    <!-- head_scrolltext -->
    <tr>
    <td>
    共和国
    </table>        <!-- end head_scrolltext -->
    </marquee>

    9.状态栏显示该页状态
    <base οnmοuseοver="window.status='网站建设 http://www.webmake.cn/' ;return true">

    10.可以点击文字实现radio选项的选定
    <br>
    &nbsp;&nbsp;&nbsp;&nbsp;<input type="radio" name="regtype" value="A03" id="A03">
    <label for="A03"> 情侣 : 一次注册两个帐户</label> <br>

    11.可以在文字域的font写onclick事件

    12.打印</a>打印网页
    <a href='javascript:window.print ()'>

    13.线型输入框
    <input type="text" name="key"  size="12" value="关键字" onFocus=this.select() onMouseOver=this.focus()

    class="line">

    14.显示文档最后修改日期
    <script language=javascript>
    function hi(str)
    {
     document.write(document.lastModified)

     alert("hi"+str+"!")
    }
    </script>

    15.可以在鼠标移到文字上时就触发事件
    <html>
    <head>
    <script language="LiveScript">
    <!-- Hiding
         function hello() {
           alert("哈罗!");
         }
    </script>
    </head>
    <body>
    <a href="" onMouseOver="hello()">link</a>
    </body>
    </html>

    16.可以根据网页上的选项来确定页面颜色
    <HTML>
    <HEAD>
     <TITLE>background.html</TITLE>
    </HEAD>
    <SCRIPT>
    <!--

    function bgChange(selObj) {
     newColor = selObj.options[selObj.selectedIndex].text;
     document.bgColor = newColor;
     selObj.selectedIndex = -1;
     }

    //-->
    </SCRIPT>
    <BODY STYLE="font-family:Arial">
    <B>Changing Background Colors</B>
    <BR>
     <FORM>
      <SELECT SIZE="8" onChange="bgChange(this);">
      <OPTION>Red
      <OPTION>Orange
      <OPTION>Yellow
      <OPTION>Green
      <OPTION>Blue
      <OPTION>Indigo
      <OPTION>Violet
      <OPTION>White
     <OPTION>pink
      </SELECT>
     </FORM>
    </BODY>
    </HTML>

    17.将按钮的特征改变
    <style type="text/css">
    <!--
    .style1 { font-size: 12px; background: #CCCCFF; border-width: thin thin thin thin; border-color: #CCCCFF

    #CCCCCC #CCCCCC #CCCCFF}
    .style2 { font-size: 12px; font-weight: bold; background: #CCFFCC; border-width: thin medium medium thin;

    border-color: #CCFF99 #999999 #999999 #CCFF99}
    -->
    </style>
      本例按钮的代码如下:
    <input type="submit" name="Submit" value="提 交" οnmοuseοver="this.className='style2'"

    οnmοuseοut="this.className='style1'" class="style1">

    18.改变按钮的图片.
    <style type="text/css">
    <!--
    .style3 { font-size: 12px; background: url(image/buttonbg1.gif); border: 0px; width: 60px; height: 22px}
    .style4 { font-size: 12px; font-weight: bold; background: url(image/buttonbg2.gif); border: 0px 0; width:

    60px; height: 22px}
    -->
    </style>
      本例的按钮代码如下:
    <input type="submit" name="Submit2" value="提 交" οnmοuseοver="this.className='style4'"

    οnmοuseοut="this.className='style3'" class="style3">

    19.打印页面
    <div align="center"><a class=content href="javascript:doPrint();">打印本稿</a></div>

    20.可以直接写html语言
    document.write("");

    21.改变下拉框的颜色
    <select name="classid"

    onChange="changelocation(document.myform.classid.options[document.myform.classid.selectedIndex].value)"

    size="1" style="color:#008080;font-size: 9pt">

    22.转至目标URL
    window.location="http://guoguo"

    23.传递该object的form
    UpdateSN('guoqiang99267',this.form)
    function UpdateSN(strValue,strForm)
    {
      strForm.SignInName.value = strValue;
      return false;
    }

    24.文字标签
    <label for="AltName4"><input name="AltName" type="RADIO" tabindex="931"  id="AltName4"

    >guoqiang99859</label>

    25.layer2为组件的ID,可以控制组件是否可见
    document.all.item('Layer2').style.display = "block";
    document.all.item('Layer2').style.display = "none";//

    26.将页面加入favorite中
    <script language=javascript>
    <!--
    function Addme(){
    url = "http://your.site.address"; //你自己的主页地址
    title = "Your Site Name"; //你自己的主页名称
    window.external.AddFavorite(url,title);
    -->
    </script>//

    27.过10秒自动关闭页面
    < script language="JavaScript" >
    function closeit() {
    setTimeout("self.close()",10000)
    }
    < /script >

    28.可以比较字符的大小
    char=post.charAt(i);
    if(!('0'<=char&&char<='9'))

    29.将字符转化为数字
    month = parseInt(char)

    30.点击value非空的选项时转向指定连接
     <select οnchange='if(this.value!="")window.open(this.value)' class="textinput">
        <option selected>主办单位</option>
        <option>-----------------</option>
        <option value="http://www.bjd.com.cn/">北京日报</option>
        <option value="http://www.ben.com.cn/">北京晚报</option>
    </select>

    31.改变背景颜色
    <td width=* class=dp bgColor=#FAFBFC οnmοuseοver="this.bgColor='#FFFFFF';"

    οnmοuseοut="this.bgColor='#FAFBFC';">

    32.改变文字输入框的背景颜色
    <style>
    .input2 {background-image: url('../images/inputbg.gif');   font-size: 12px; background-color:

    #D0DABB;border-top-width:1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px}
    </style>
    <input name=content type=text size="47" class="input2" maxlength="50">

    33.改变水平线的特征
    <hr size="0" noshade color="#C0C0C0">

    34.传递参数的方式
    <a href="vote.asp?CurPage=8&id=3488">8</a>

    35.页内跳转
    <a href="#1">1</a>
    <a href="#2">2</a>
    <a href="#3">3</a>
    <a href="#4">4</a>
    <a href="#5">5</a>
    <a href="#6">6</a>
    <a href="#7">7</a>
    <a name="1">dfdf</a>
    <a name="2">dfdf</a>//

    36.两个按键一起按下
    if(event.ctrlKey && window.event.keyCode==13)//

    37.刷新页面
    javascript:this.location.reload()//

    38.将网页的按钮使能
    <SCRIPT LANGUAGE="JavaScript">
    function haha()
    {
     for(var i=0;i<document.form1.elements.length;i++)
     {
      if(document.form1.elements[i].name.indexOf("bb")!=-1)
       document.form1.elements[i].disabled=!document.form1.elements[i].disabled;
     }
    }
    </SCRIPT>
    <BODY><form name=form1>
    <INPUT TYPE="button" NAME="aa "  value=cindy οnclick=haha()>
    <INPUT TYPE="button" NAME="bb " value=guoguo>
    <INPUT TYPE="button" NAME="bb " value=guoguo>

    39.文字移动
    <marquee scrollamount=3 οnmοuseοver=this.stop(); οnmοuseοut=this.start();>

    40.双击网页自动跑
    <SCRIPT LANGUAGE="JavaScript">
    var currentpos,timer;
    function initialize()
    {
     timer=setInterval("scrollwindow()",1);
    }
    function sc()
    {
     clearInterval(timer);
    }
    function scrollwindow()
    {
     currentpos=document.body.scrollTop;
     window.scroll(0,++currentpos);
     if (currentpos != document.body.scrollTop)
      sc();
    }
    document.οnmοusedοwn=sc
    document.οndblclick=initialize
    </SCRIPT>//

    41.后退
    <INPUT TYPE="button" οnclick=window.history.back() value=back>

    42.前进
    <INPUT TYPE="button" οnclick=window.history.forward() value=forward>

    43.刷新
    <INPUT TYPE="button" οnclick=document.location.reload() value=reload>

    44.转向指定网页
    document.location="http://ww"或者document.location.assign("http://guoguo.com")

    45.在网页上显示实时时间
    <SCRIPT LANGUAGE="JavaScript">
    var clock_id;
    window.οnlοad=function()
    {
     clock_id=setInterval("document.form1.txtclock.value=(new Date);",1000)
    }
    </SCRIPT>//

    46.可以下载文件
    document.location.href="目标文件"//

    47.连接数据库
    import java.sql.*;
    String myDBDriver="sun.jdbc.odbc.JdbcOdbcDriver";
    Class.forName(myDBDriver);
    Connection conn=DriverManager.getConnection("jdbc:odbc:firm","username","password");
    Statement stmt=conn.createStatement();
    ResultSet rs=stmt.executeQuery(sql);
    rs.getString("column1");//

    48.可以直接在页面“div”内写下所需内容
    <INPUT TYPE="button" οnclick="a1.innerHTML='<font color=red>*</font>'">
    <div id=a1></div>//

    49.可以改变页面上的连接的格式,使其为双线
    <style>
    A:link {text-decoration: none; color:#0000FF; font-family: 宋体}
    A:visited {text-decoration: none; color: #0000FF; font-family: 宋体}
    A:hover {text-decoration: underline overline; color: FF0000}
    </style>

    <style>
    A:link {text-decoration: none; color:#0000FF; font-family: 宋体}
    A:visited {text-decoration: none; color: #0000FF; font-family: 宋体}
    A:hover {text-decoration: underline overline line-through; color: FF0000}
    TH{FONT-SIZE: 9pt}
    TD{FONT-SIZE: 9pt}
    body {SCROLLBAR-FACE-COLOR: #A9D46D; SCROLLBAR-HIGHLIGHT-COLOR: #e7e7e7;SCROLLBAR-SHADOW-COLOR:#e7e7e7;

    SCROLLBAR-3DLIGHT-COLOR: #000000; LINE-HEIGHT: 15pt; SCROLLBAR-ARROW-COLOR: #ffffff;

    SCROLLBAR-TRACK-COLOR: #e7e7e7;}

    INPUT{BORDER-TOP-WIDTH: 1px; PADDING-RIGHT: 1px; PADDING-LEFT: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE:

    9pt; BORDER-LEFT-COLOR: #cccccc;
    BORDER-BOTTOM-WIDTH: 1px; BORDER-BOTTOM-COLOR: #cccccc; PADDING-BOTTOM: 1px; BORDER-TOP-COLOR: #cccccc;

    PADDING-TOP: 1px; HEIGHT: 18px; BORDER-RIGHT-WIDTH: 1px; BORDER-RIGHT-COLOR: #cccccc}
    DIV,form ,OPTION,P,TD,BR{FONT-FAMILY: 宋体; FONT-SIZE: 9pt}
    textarea, select {border-width: 1; border-color: #000000; background-color: #efefef; font-family: 宋体;

    font-size: 9pt; font-style: bold;}
    .text { font-family: "宋体"; font-size: 9pt; color: #003300; border: #006600 solid; border-width: 1px 1px

    1px 1px}
    </style>完整的css


    50.新建frame
    <a

    href="javascript:newframe('http://www.163.net/help/a_little/index.html','http://www.163.net/help/a_little

    /a_13.html')"><img alt=帮助 border=0 src="http://bjpic.163.net/images/mail/button-help.gif"></a>

    51.向文件中写内容
    <%@ page import="java.io.*" %>
    <%
     String str = "print me";
     //always give the path from root. This way it almost always works.
     String nameOfTextFile = "/usr/anil/imp.txt";
     try
     {
      PrintWriter pw = new PrintWriter(new FileOutputStream(nameOfTextFile));
      pw.println(str);
      //clean up
      pw.close();
     }
     catch(IOException e)
     {
      out.println(e.getMessage());
     }
    %>

    52.先读文件再写文件
    <%@ page language = "java" %>
    <%@ page contentType = "text/html; charSet=gb2312" %>
    <%@ page import ="java.util.*" %>
    <%@ page import ="java.lang.*" %>
    <%@ page import ="javax.servlet.*" %>
    <%@ page import ="javax.servlet.jsp.*" %>
    <%@ page import ="javax.servlet.http.*" %>
    <%@ page import="java.io.*" %>
    eryrytry
    <%
     int count=0;
     FileInputStream fi =new FileInputStream ("count.txt");
     ObjectInputStream si= new ObjectInputStream (fi);
     count =si.readInt();
     count++;
     out.print(count);
     si.close();

     FileOutputStream fo =new FileOutputStream ("count.txt");
     ObjectOutputStream so= new ObjectOutputStream (fo);
     so.writeInt(count);
     so.close();
    %>

    53.直线型输入框
    <INPUT name=Password size=10 type=password style="border-left-width: 0; border-right-width: 0;

    border-top-width: 0; border-bottom-style: solid; border-bottom-width: 1; background-color: #9CEB9C">

    54.可以将背景改为按钮性状,通过改变css改变属性
    <td width="65" align="center" bgcolor="#E0E0E0" οnmοuseοver=this.className='mouseoverbt';

    οnmοuseοut=this.className='mouseout';><a href="tm.asp?classid=76"><font

    color="#000000">录音笔</font></a></td>
    <style>
    .mouseoverbt
    {
     background-image: url(http://www.yongle.com.cn/img/btbgw64h20y.gif);
     background-repeat: no-repeat;
    }
    .mouseout
    {
     background-color: #E0E0E0;
    }
    </style>

    55.同时按下CTRL和Q键
    document.οnkeydοwn=function()
    {
    if(event.ctrlKey&&event.keyCode==81)
    {alert(1)}
    }//

    56.以下是一个完整的显示hint的代码,其思想是当鼠标停留是将div中的内容显示在鼠标出,当鼠标移出后在将该div隐

    藏掉
    ---------------------------------------------------------------------------------------------------------

    ------------
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <style>
    #hint{
     width:198px;
     border:1px solid #000000;
     background:#99ff33;
     position:absolute;
     z-index:9;
     padding:6px;
     line-height:17px;
     text-align:left;
     top: 1520px;
    }
    </style>
    <SCRIPT LANGUAGE="JavaScript">
    <!--
    function showme()
    {
     var oSon=window.document.getElementByIdx_x("hint");
     if (oSon==null) return;
     with (oSon)
     {
      innerText=guoguo.value;
      style.display="block";
      style.pixelLeft=window.event.clientX+window.document.body.scrollLeft+6;
      style.pixelTop=window.event.clientY+window.document.body.scrollTop+9;
     }
    }
    function hidme()
    {
     var oSon=window.document.getElementByIdx_x("hint");
     if (oSon==null) return;
     oSon.style.display="none";
    }
    //-->
    </SCRIPT>
    <BODY>
    <text id=guoguo value=ga>
    <a href=# οnmοuseοver=showme() οnmοuseοut=hidme() οnmοusemοve=showme() son=hint>dfdfd</a>
    <div id=hint style="display:none"></div>
    </BODY>
    </HTML>
    ---------------------------------------------------------------------------------------------------------

    ------------

    57.弹出窗口
    方法一:<body οnlοad="openwen()"> 浏览器读页面时弹出窗口;
    方法二:<body οnunlοad="openwen()"> 浏览器离开页面时弹出窗口;
    方法三:用一个连接调用:<a href="#" οnclick="openwin()">打开一个窗口</a>
    注意:使用的"#"是虚连接。
    方法四:用一个按钮调用:<input type="button" οnclick="openwin()" value="打开窗口"> 何时装载script


    58.动态改变字体的大小
    function doZoom(size)
    {
       document.getElementByIdx_x('zoom').style.fontSize=size+'px'
    }

    function aa()
    {
       var newWin=window.open(url);
       newWin.document.form1.text1.value=value1;
    }改变弹出窗口上域的属性
    opener.document.form2.text2.value=value2;改变父窗口的域的值

    59.判断是何种浏览器
    var name = navigator.appName;
    if (name == "Microsoft Internet Explorer")
     alert("IE");
    else if (name == "Netscape")
     alert("NS");//

    60.vbsscript确定框
    <script language="VBScript">
    <!--
    MsgBox "确定删除吗?", 4
    //-->
    </script>//

    61.复制内容到剪切板
    function JM_cc(bb)
    {
        var ob=eval_r("document.form1."+bb);
        ob.select();
        js=ob.createTextRange();
        js.execCommand("Copy");
    }//

    62.java中建立数据库连接取数据
    public void init()
    {
     String url="jdbc:odbc:javadata";
     try
     {
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
      Connection con=DriverManager.getConnection(url,"sa","");//mssql database user SA and password
      DatabaseMetaData dma=con.getMetaData();
      System.out.println("Connect to"+dma.getURL());
      System.out.println(";Driver "+dma.getDriverName());
      System.out.println(";Version "+dma.getDriverVersion());
      System.out.println("");
      Statement stmt=con.createStatement();
      ResultSet rs=stmt.executeQuery("select * from company.dbo.TB_NAME where number=1");//Sql
      rs.next();
      String dispresult=rs.getString("name");
      System.out.println(dispresult);// Instead,you can display it in Paint() or use AWT etc.
      rs.close();
      stmt.close();
      con.close();
     }
     catch(SQLException ex)
     {
      System.out.println("!!!SQL Exception !!!");
      while(ex!=null)
      {
       System.out.println("SQLState:"+ex.getSQLState());
       System.out.println("Message:"+ex.getMessage());
       System.out.println("Vendor:"+ex.getErrorCode());
       ex=ex.getNextException();
       System.out.println("");
      }

     }
     catch(java.lang.Exception ex)
     {
      ex.printStackTrace();
     }
    }//


    63.最小化窗口
    window.blur()//


    64.文档的路径
    document.URL//

    65.定时执行某段程序
    setTimeout("change_color()",600);

    66.设置为主页
    function makeHome(){
      netscape.security.PrivilegeManager.enablePrivilege("UniversalPreferencesWrite");
      navigator.preference("browser.startup.homepage", location.href);
    }//

    67.设置为收藏
    function addFav(){
      if(ie)
        window.external.AddFavorite(location.href,'WWW.OGRISH.COM : GROTESQUE MOVIES AND PICTURES');
      if(ns)
        alert("Thanks for the bookmark!/n/nNetscape users click OK then press CTRL-D");
    }//

    68.判断cookie是否可用
    navigator.cookieEnabled;//

    69.显示有模式的有页面的弹出窗口
    function setbgcolor_onclick()
    {
     var color = showModalDialog("/mailpage/compose/colorsel.html",0,"help=0");
     if (color != null)
     {
      document.compose.bgcolor.value = color;
     }
    }//


    70.截取小数点后两位
    var a=3454545.4454545;
    alert(a.toFixed(2));//


    71.禁止选择页面上的文字来拷贝
    <script>
    function noEffect() {
      with (event) {
        returnValue = false;
        cancelBubble = true;
      }
      return;
    }
    </script>
    <body onselectstart="noEffect()" οncοntextmenu="noEffect()">//

    72.屏蔽右键菜单
    οncοntextmenu="event.returnValue = false"//

    73.事件禁止起泡
    event.cancelBubble = true//

    74.禁止在输入框打开输入法
    <input style="ime-mode: disabled">//

    75.屏蔽汉字和空格
    <input name="txt"><input type="submit" onClick="alert(!/[^ -}]|/s/.test(txt.value))">//

    76.用javascript判断文件是否存在
    function Exists(filespec)
    {
     if (filespec)
     {
      var fso;
      fso = new ActiveXObject("Scripting.FileSystemObject");
      alert(fso.FileExists(filespec));
     }
    }
    选择图片 <input type=file name=f1><p>
    <input type="submit" onClick="Exists(f1.value)">//

    77.获得当前的文本框选中的文字
    <input οnmοuseup="alert(document.selection.createRange().text)" value=123>//

    78.跳转至目标页面,同时不可返回
    <a href="javascript:location.replace('http://www.sohu.com/')">sohu.com</a>//

     
    79.获得当前的行是表格的第几行
    <script>
    function getrow(obj)
    {
       if(event.srcElement.tagName=="TD"){
       curRow=event.srcElement.parentElement;
       alert("这是第"+(curRow.rowIndex+1)+"行");

       }
    }
    </script>

    <table border="1" width="100%" οnclick=getrow(this)>
      <tr>
        <td width="20%"> </td>
        <td width="20%"> </td>
        <td width="20%"> </td>
        <td width="20%"> </td>
        <td width="20%"> </td>
      </tr>
      <tr>
        <td width="20%"> </td>
        <td width="20%"> </td>
        <td width="20%"> </td>
        <td width="20%"> </td>
        <td width="20%"> </td>
      </tr>
    </table>//

    80.删除表格某行,xx表示某行,下标从0开始计算
    document.all.myTable.deleteRow(xx)//

    81.动态的向表格中添加行
    <table id="t1" border="1">
    </table>
    <script language="JavaScript">
    function add()
    {
       t1.insertRow().insertCell().innerHTML = '<input name="test'+t1.rows.length+'">';
    }//

    82.event.x,event.clientX,event.offsetX区别:
    x:设置或者是得到鼠标相对于目标事件的父元素的外边界在x坐标上的位置。 clientX:相对于客户区域的x坐标位置,不

    包括滚动条,就是正文区域。 offsetx:设置或者是得到鼠标相对于目标事件的父元素的内边界在x坐标上的位置。
    screenX:相对于用户屏幕。

     
    83.显示是鼠标按钮的哪个
    <body onMouseDown="alert(event.button)">点Mouse看看//

    84.打开C盘
    <form action="file:///c|/"><input type="submit" value="c:/ drive"></form>//
     
    85.当前屏幕的分辨率
    screen.width、screen.height//

    86.设置表格中的内容
    tbl.rows[0].cells[1].innerText=document.form.text1.value;//

     
    87.本地快捷键
    <p><a href="file:///::{208D2C60-3AEA-1069-A2D7-08002B30309D}" target="_blank">网上邻居</a></p>
    <p><a href="file:///::{20D04FE0-3AEA-1069-A2D8-08002B30309D}/d:/web" target="_blank">我的电脑</a></p>
    <p><a href="file:///::{450D8FBA-AD25-11D0-98A8-0800361B1103}" target="_blank">我的文档</a></p>
    <p><a href="file:///::{645FF040-5081-101B-9F08-00AA002F954E}" target="_blank">回收站</a></p>
    <p><a href="file:///::{20D04FE0-3AEA-1069-A2D8-08002B30309D}/::{21EC2020-3AEA-1069-A2DD-08002B30309D}"

    target="_blank">控制面板</a></p>
    <p><a href="file:///::{7007ACC7-3202-11D1-AAD2-00805FC1270E}">拨号网络</a>(windows 2000)</p>

     
    88.IE菜单
    <button οnclick="min.Click()"><font face="webdings">0</font></button>//改变按钮上的图片
    <input type=button  οnclick="document.execCommand('CreateLink','true','true')"> //创建新连接
    <input type=button  οnclick="document.execCommand('print','true','true')"> //打印
    <input type=button  οnclick="document.execCommand('saveas','true','网站制作.htm')">//另存为htm
    <input type=button  οnclick="document.execCommand('saveas','true','网站制作.txt')">//另存为txt
    document.execCommand("SaveAs")//保存为
    document.execCommand('undo')//撤销上一次操作

    89.web对话框
    <SCRIPT>
    var contents='<style>body,td{font:menu}img{cursor:hand}</style>';
    contents+='<title>你要关闭我吗</title>';
    contents+='<body bgcolor=menu>';
    contents+='<table width=100% height=100% border=0>';
    contents+='<tr><td align=center>';
    contents+='你要关闭我吗?<br>';
    contents+='<img src=dark.gif οnclick=self.close() alt="...关闭">';
    contents+='<img src=jet.gif οnclick=self.close() alt="全是关闭">';
    contents+='</td></tr></table>';
    showModalDialog("about:"+contents+"","","dialogHeight:50px;dialogWidth:250px;help:no;status:no")
    document.write(contents);
    </SCRIPT>//

    90.取第x,y的值
    <button οnclick="t1.rows[x].cells[y].innerText='guoguo'"></button>//

    91.向新打开的网页上写内容
    newwin=window.open('about:blank','','top=10');
    newwin.document.write('');//

    93.返回
    javascript:history.go(-2);//

    94.将页面上选中的内容复制到剪贴板
    abcdefg
    <input type='button'

    οnclick="window.clipboardData.setData('text',document.selection.createRange().text);" value='复制页面选中

    的字符'>//
    95.将页面上选中的内容复制到剪贴板
    <INPUT TYPE="text" NAME="">kjhkjhkhkj<INPUT TYPE="button" οnclick="document.execCommand('Copy', 'false',

    null);">

    96.鼠标移到下拉框时自动全部打开
    <select οnmοuseοver="javascript:this.size=this.length" οnmοuseοut="javascript:this.size=1"></select>//

    97.获得本机的文件
    var fso = new ActiveXObject("Scripting.FileSystemObject");
    var f1 = fso.GetFile("C://bsitcdata//ejbhome.xml");
    alert("File last modified: " + f1.DateLastModified); //

    98.判断客户端是否是IE浏览器
    因为 document.all 是 IE 的特有属性,所以通常用这个方法来判断客户端是否是IE浏览器 ,document.all?1:0;

    99.创建新的下拉框选项
    new Option(text,value)这样的函数//

    100.在页面上画柱状图
    <STYLE>
    td{font-size:12px}
    body{font-size:12px}
    v/:*{behavior:url(#default#VML);} //这里声明了v作为VML公用变量
    </STYLE>
    <SCRIPT LANGUAGE="JavaScript">
    mathstr=12;
    document.write ("<v:rect fillcolor='red'

    style='width:20;color:navy;height:"+5000/(1000/mathstr)+"'><br>&nbsp;%"+mathstr+"<br>4人<v:Extrusion

    backdepth='15pt' on='true'/></v:rect>")
    </SCRIPT>
    <v:rect fillcolor='red' style='width:20;color:navy;height:200'><br><br>4人<v:Extrusion

    backdepth='15pt' on='true'/></v:rect>
    <v:rect fillcolor='yellow' style='width:20;color:navy;height:100'><br><br>4人<v:Extrusion

    backdepth='15pt' on='true'/></v:rect>//

    101.饼图
    <style>
    v/:*     { behavior: url(#default#VML) }
    o/:*     { behavior: url(#default#VML) }
    .shape    { behavior: url(#default#VML) }
    </style>
    <script language="javascript">
    function show(pie)
    {
    pie.strokecolor=pie.fillcolor;
    pie.strokeweight=10;
    div1.innerHTML="<font size=2 color=red> " + pie.id +"</font> <font size=2>" + pie.title + "</font>";
    }
    function hide(pie)
    {
    pie.strokecolor="white";
    pie.strokeweight=1;
    div1.innerHTML="";
    }
    </script>
    </head>
    <body>
    <v:group style='width: 5cm; height: 5cm' coordorigin='0,0' coordsize='250,250'>
    <v:shape id='asp技术' style='width:10;height:10;top:10;left:0' title='得票数:6 比例:40.00%'

    οnmοuseοver='javascript:show(this);' οnmοuseοut='javascript:hide(this);' href='http://www.cnADO.com'

    CoordSize='10,10' strokecolor='white' fillcolor='#ffff33'><v:path v='m 300,200 ae

    300,200,200,150,0,9437184 xe'/></v:shape>
    <v:shape id='php' style='width:10;height:10;top:10;left:0' title='得票数:1 比例:6.67%'

    οnmοuseοver='javascript:show(this);' οnmοuseοut='javascript:hide(this);' href='http://www.cnADO.com'

    CoordSize='10,10' strokecolor='white' fillcolor='#ff9933'><v:path v='m 300,200 ae

    300,200,200,150,9437184,1572864 xe'/></v:shape>
    <v:shape id='jsp' style='width:10;height:10;top:10;left:0' title='得票数:2 比例:13.33%'

    οnmοuseοver='javascript:show(this);' οnmοuseοut='javascript:hide(this);' href='http://www.cnADO.com'

    CoordSize='10,10' strokecolor='white' fillcolor='#3399ff'><v:path v='m 300,200 ae

    300,200,200,150,11010048,3145728 xe'/></v:shape>
    <v:shape id='c#写的.netWEB程序' style='width:10;height:10;top:10;left:0' title='得票数:3 比例:20.00%'

    οnmοuseοver='javascript:show(this);' οnmοuseοut='javascript:hide(this);' href='http://www.cnADO.com'

    CoordSize='10,10' strokecolor='white' fillcolor='#99ff33'><v:path v='m 300,200 ae

    300,200,200,150,14155776,4718592 xe'/></v:shape>
    <v:shape id='vb.net写的.netWEB程序' style='width:10;height:10;top:10;left:0' title='得票数:2 比例:13.33%'

    οnmοuseοver='javascript:show(this);' οnmοuseοut='javascript:hide(this);' href='http://www.cnADO.com'

    CoordSize='10,10' strokecolor='white' fillcolor='#ff6600'><v:path v='m 300,200 ae

    300,200,200,150,18874368,3145728 xe'/></v:shape>
    <v:shape id='xml技术' style='width:10;height:10;top:10;left:0' title='得票数:1 比例:6.67%'

    οnmοuseοver='javascript:show(this);' οnmοuseοut='javascript:hide(this);' href='http://www.cnADO.com'

    CoordSize='10,10' strokecolor='white' fillcolor='#ff99ff'><v:path v='m 300,200 ae

    300,200,200,150,22020096,1572864 xe'/></v:shape>
    </v:group>

    <v:group style='width: 6cm; height: 6cm' coordorigin='0,0' coordsize='250,250'>
    <v:rect style='height:10;width:15;top:0;left:10' fillcolor='#ffff33'/>
    <v:rect style='height:28;width:100;top:0;left:30' stroked='false'><v:textbox

    style='fontsize:2'>asp技术</v:textbox/></v:rect>
    <v:rect style='height:10;width:15;top:30;left:10' fillcolor='#ff9933'/>
    <v:rect style='height:28;width:100;top:30;left:30' stroked='false'><v:textbox

    style='fontsize:2'>php</v:textbox/></v:rect>
    <v:rect style='height:10;width:15;top:60;left:10' fillcolor='#3399ff'/>
    <v:rect style='height:28;width:100;top:60;left:30' stroked='false'><v:textbox

    style='fontsize:2'>jsp</v:textbox/></v:rect>
    <v:rect style='height:10;width:15;top:90;left:10' fillcolor='#99ff33'/>
    <v:rect style='height:28;width:100;top:90;left:30' stroked='false'><v:textbox

    style='fontsize:2'>c#写的.netWEB程序</v:textbox/></v:rect>
    <v:rect style='height:10;width:15;top:120;left:10' fillcolor='#ff6600'/>
    <v:rect style='height:28;width:100;top:120;left:30' stroked='false'><v:textbox style='fontsize:2'>vb.net

    写的.netWEB程序</v:textbox/></v:rect>
    <v:rect style='height:10;width:15;top:150;left:10' fillcolor='#ff99ff'/>
    <v:rect style='height:28;width:100;top:150;left:30' stroked='false'><v:textbox style='fontsize:2'>xml技术

    </v:textbox/></v:rect>
    </v:group>

    <div style="position: absolute; left: 10; top: 10; width: 760; height:16">
     <table border="1" cellpadding="2" cellspacing="2" cellpadding="0" cellspacing="0"

    style="border-collapse: collapse" bordercolor="#CCCCCC" width="100%" ID="Table1">
      <tr>
       <td width="100%" id=div1> </td>
      </tr>
     </table>
    </div>//

    102.是一个特殊的容器,想装个网页都行
    <button><iframe src="http://www.google.com/"></iframe></button>//button

    103.外部的html代码
    event.srcElement.outerHTML//

    104.标识当前的IE事件的触发器
    event.srcElement和event.keyCode//

    105.事件类型
    event.type//

    106.动态改变类型
    <style>
    .Overnone { border-width:0;background-color:darkblue;cursor:default;color:gold;width:115}
    .Outnone   {border-width:0;background-color:white;cursor:default;width:115}
    </style>
    <input class=Outnone οnmοuseοver=this.className='Overnone' >//

    107.页面翻转
    <html dir=rtl></html>//

    108.滚屏
    parent.scroll(x,y);//
    <body οnlοad="s=0" onDblClick="s=setInterval('scrollBy(0, 1)',10)" onClick="clearInterval(s)">//

    109.改变状态栏
    self.status ="";//

    110.改变窗口大小
    window.resizeTo(200,300);//

    111.改变鼠标样式
    style
    BODY{CURSOR: url('mouse.ani');
    SCROLLBAR-BASE-COLOR: #506AA8;
    SCROLLBAR-ARROW-COLOR: #14213F;
    }//

    112.背景透明
    <input type="button" value="Button" style="background-color: transparent; border: 0;">//

    113.鼠标为等待形状
    <input type=button οnclick="this.style.cursor='wait'">//

    114.调用父窗口的函数
    opener.fucntion1();//

    115.body的内部html代码
    <input type="button" οnclick="alert(code.document.body.innerHTML)" value="查看">//

    116.框架中调用父窗口的函数
    <INPUT TYPE='button' οnclick='parent.test();' value='调用parent窗口的函数'>//

    117.交换节点
    <table  width=200  height=200  border>
    <tr><td  id=c1>CELL_1</td></tr>
    <tr><td  id=c2>CELL_2</td></tr>
    </table>
    <br>
    <input  type="button"  value="swap  row"  οnclick="c1.swapNode(c2)">//

    118.删除节点
    <table  width=200  height=200  border>
    <tr id=trall><td  id=c1>CELL_1</td></tr>
    <tr><td  id=c2>CELL_2</td></tr>
    </table>
    <br>
    <input  type="button"  value="swap  row"  οnclick="trall.removeNode(c2)">//

    119.添加节点
    addNode()//

    120.获得事件的父与子标签
    event.srcElement.children[0]和event.srcElement.parentElement //

     
    121.集中为按钮改变颜色
    <style>
    button{benc:expression_r(this.onfocus = function(){this.style.backgroundColor='#E5F0FF';})}
    </style>
    <button>New</button>//


    122.判断是左键还是右键被按下
    <body οnmοusedοwn=if(event.button==1)alert("左键");if(event.button==2)alert("右键")>//

    123.获得操作系统的名称和浏览器的名称
    document.write(navigator.userAgent)//

     
    124.alt/ctrl/shift键按下
    event.altKey //按下alt键
    event.ctrlKey //按下ctrl键
    event.shiftKey //按下shift键

    125.将当前位置定位为C盘。
    {window.location="c:"}//

    126.返回输入框的类型
    <script>
    alert(event.srcElement.type);//
    </script>

    127.模拟控件的单击事件
    <INPUT TYPE="hidden" name="guoguo" οnclick="haha()">
    <SCRIPT LANGUAGE="JavaScript">
    <!--

    function haha()
    {
     alert();
    }
    guoguo.click();
    //-->
    </SCRIPT>//

     
    128.取出记录集的列名
    java.sql.ResultSet rset = com.bsitc.util.DBAssist.getIT().executeQuery(queryStatement, conn);
    java.sql.ResultSetMetaData metaData = rset.getMetaData();
    int count = metaData.getColumnCount();
    String name = metaData.getColumnName(i);
    String value = rset.getString(i);//

    129.格式化数字
    function format_number(str,digit)
    {
     if(isNaN(str))
     {
      alert("您传入的值不是数字!");
      return 0;
     }
     else if(Math.round(digit)!=digit)
     {
      alert("您输入的小数位数不是整数!");
      return 0;
     }
     else
      return Math.round(parseFloat(str)*Math.pow(10,digit))/Math.pow(10,digit);
    }

    130.回车按钮转化为tab按钮
    if(event.keyCode==13) event.keyCode=9; //将

     
    131.滚动条滚动
    <button οnclick="text1.scrollTop=text1.scrollHeight">Scroll</button><br>
    <textarea id="text1" cols=50 rows=10>
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    </textarea>//

     
    132.判断是什么对象
    if(typeof(unknown)=="function")return true;
    if(typeof(unknown)!="object")return false;//

     
    133.取消文本框自动完成功能
    <input type="text" > //

    134.让下拉框自动下拉
    <select οnmοuseοver="javascript:this.size=this.length" οnmοuseοut="javascript:this.size=1">
    <option value="">1</option>
    <option value="">2</option>
    <option value="">3</option>
    </select> //

     
    135.读取XML文件
    var childrenobj=myselect//document.all.myselect;
        var oXMLDoc = new ActiveXObject('MSXML');
        oXMLDoc.url = "mymsg.xml";
        var oRoot=oXMLDoc.root;
        if(oRoot.children != null)
     {
            for(var i=0;i<oRoot.children.item(0).children.length;++i)
      {
                oItem = oRoot.children.item(0).children.item(i);
                oOption = new Option(oItem.text,oItem.value);
       childrenobj.add(oOption);
            }
        }
    //mymsg.xml文件
    <?xml version="1.0" encoding="gb2312" ?>
    <childrenlist>
    <aa>
    <child value='3301'>杭州地区</child>

    <child value='3303'>温州地区</child>

    </aa>
    <aa>
    <child value='3310'>台州地区</child>

    <child value='3311'>丽水地区</child>
    </aa>
    </childrenlist>//

     
    136.点击图片,图片停止
    <a href="javascript:"><img src="http://www.51js.com/images/51js/red_forum.gif" border="0"></a>//

    137.显示本地计算机信息
    var WshNetwork = new ActiveXObject("WScript.Network");
    alert("Domain = " + WshNetwork.UserDomain);
    alert("Computer Name = " + WshNetwork.ComputerName);
    alert("User Name = " + WshNetwork.UserName);//

     
    138.比较时间
      tDate = new Date(2004,01,08,14,35); //年,月,日,时,分
      dDate = new Date();
      tDate<dDate?alert("早于"):alert("晚于");//

    139.弹出鼠标所在处的链结地址
      <body οnmοuseοver="if (event.srcElement.tagName=='A')alert(event.srcElement.href)"><a

    href="http://51js.com/viewthread.php?tid=13589" >dddd</a><input>//

    140.注意不能通过与 undefined 做比较来测试一个变量是否存在,虽然可以检查它的类型是否为“undefined”。在以

    下的代码范例中,假设程序员想测试是否已经声明变量 x :
    // 这种方法不起作用
    if (x == undefined)
        // 作某些操作
    // 这个方法同样不起作用- 必须检查


    // 字符串 "undefined"
    if (typeof(x) == undefined)
        // 作某些操作
    // 这个方法有效
    if (typeof(x) == "undefined")
        // 作某些操作

    141.创建具有某些属性的对象
    var myObject = new Object();
    myObject.name = "James";
    myObject.age = "22";
    myObject.phone = "555 1234";//

    142.枚举(循环)对象的所有属性
    for (var a in myObject)
    {
        // 显示 "The property 'name' is James",等等。
        window.alert("The property '" + a + "' is " + myObject[a]);
    }//

    143.判断一个数字是否是整数
    var a=23.2;
    alert(a%1==1)//


    144.新建日期型变量
    var a = new Date(2000, 1, 1);
    alert(a.toLocaleDateString());


    145.给类定义新的方法
    function trim_1()
    {
      return this.replace(/(^/s*)|(/s*$)/g, "");
    }
    String.prototype.trim=trim_1;
    alert('cindy'.trim());

     
    146.定义一个将日期类型转化为字符串的方法
    function guoguo_date()
    {
     var tmp1,tmp2;
     tmp1 =this.getMonth()+1+"";
     if(tmp1.length<2)
      tmp1="0"+tmp1;
     tmp2 =this.getDate()+"";
     if(tmp2.length<2)
      tmp2="0"+tmp2;
     
     return this.getYear()+"-"+tmp1+"-"+tmp2;
    }
    Date.prototype.toLiteString=guoguo_date;
    alert(new Date().toLiteString())

    147. pasta 是有四个参数的构造器,定义对象。
    function pasta(grain, width, shape, hasEgg)
    {
        // 是用什么粮食做的?
        this.grain = grain;

        // 多宽?(数值)
        this.width = width;   

        // 横截面形状?(字符串)
        this.shape = shape; 

        // 是否加蛋黄?(boolean)
        this.hasEgg = hasEgg;

        //定义方法
        this.toString=aa;
    }
    function aa()
    {
     ;
    }
    //定义了对象构造器后,用 new 运算符创建对象实例。
    var spaghetti = new pasta("wheat", 0.2, "circle", true);
    var linguine = new pasta("wheat", 0.3, "oval", true);
    //补充定义属性,spaghetti和linguine都将自动获得新的属性
    pasta.prototype.foodgroup = "carbohydrates";

     
    148.打印出错误原因
    try
    {
     x = y   // 产生错误。
    }
    catch(e)
    {
       document.write(e.description)   //打印 "'y' is undefined".
    }//

    149.生成EXCEL文件并保存
    var ExcelSheet;
    ExcelApp = new ActiveXObject("Excel.Application");
    ExcelSheet = new ActiveXObject("Excel.Sheet");
    //本代码启动创建对象的应用程序(在这种情况下,Microsoft Excel 工作表)。一旦对象被创建,就可以用定义的对

    象变量在代码中引用它。 在下面的例子中,通过对象变量 ExcelSheet 访问新对象的属性和方法和其他 Excel 对象,

    包括 Application 对象和 ActiveSheet.Cells 集合。
    // 使 Excel 通过 Application 对象可见。
    ExcelSheet.Application.Visible = true;
    // 将一些文本放置到表格的第一格中。
    ExcelSheet.ActiveSheet.Cells(1,1).Value = "This is column A, row 1";
    // 保存表格。
    ExcelSheet.SaveAs("C://TEST.XLS");
    // 用 Application 对象用 Quit 方法关闭 Excel。
    ExcelSheet.Application.Quit();//

    150.根据标签获得一组对象
    var coll = document.all.tags("DIV");
    if (coll!=null)
    {
    for (i=0; i<coll.length; i++)
    ...
    }//
      
    151.实现打印预览及打印
    <OBJECT classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2" height=0 id=wb name=wb width=0></OBJECT>
    <input type=button value=打印预览 οnclick="wb.execwb(7,1)">
    <input type=button onClick=document.all.wb.ExecWB(6,1) value="打印">//

    152.不通过form,直接通过名字引用对象
    <INPUT TYPE="text" NAME="gg" value=aaaaa>
    <SCRIPT LANGUAGE="JavaScript">
    <!--
    alert(document.all.gg.value)
    //-->
    </SCRIPT>//

    153.使鼠标滚轮失效
    function document.onmousewheel()
    {
     return false;
    }//
     
    154.创建弹出窗口
    <SCRIPT LANGUAGE="JScript">
      var oPopup = window.createPopup();
      var oPopupBody = oPopup.document.body;
      oPopupBody.innerHTML = "Display some <B>HTML</B> here.";
      oPopup.show(100, 100, 200, 50, document.body);
    </SCRIPT>//

    155.取得鼠标所在处的对象
    var obj = document.elementFromPoint(event.x,event.y);//

    156.获得左边的对象
    <INPUT TYPE="text" NAME="gg"><INPUT TYPE="text" NAME="bb"

    οnclick="this.previousSibling.value='guoguo'">//

    157.定位鼠标
    document.all.hint_layer.style.left  = event.x+document.body.scrollLeft+10;
    document.all.hint_layer.style.top  = event.y+document.body.scrollTop+10;//

    158.向下拉框指定位置添加项目
    var op  = document.createElement_x("OPTION");
    document.all.selected_items.children(index).insertAdjacentElement("BeforeBegin",op);
    op.text  = document.all.all_items[i].text;
    op.value = document.all.all_items[i].value;//

     
    159.判断一个窗口是否已经打开,如果已经打开,则关闭之
    var a;
    if(a)
     a.close();
    else
     a=window.open('','','');//

    160.动态创建一个标签
    newElem  = document.createElement_x("DIV");
    newElem.id = "hint_layer";
    document.body.appendChild(newElem);
    document.all.hint_layer.innerText="guoguo";//

    161.标题栏
    document.title//

    162.背景图片
    <body style="BACKGROUND-ATTACHMENT: fixed" background="img/bgfix.gif" ></body>//背景图片不动

    <STYLE TYPE="text/css">
    <!--
    BODY {background-image:img/bgchild.jpg;
    background-position: center;
    background-repeat: no-repeat;
    background-attachment: fixed;}
    -->
    </STYLE>//背景图片居中

    163.设置透明效果
    document.form.xxx.filters.alpha.opacity=0~100//

    164.定义方法
    var dragapproved=false;
    document.οnmοuseup=new Function("dragapproved = false");//
     
    165.将数字转化为人民币大写形式
    function convertCurrency(currencyDigits) {
    // Constants:
     var MAXIMUM_NUMBER = 99999999999.99;
     // Predefine the radix characters and currency symbols for output:
     var CN_ZERO = "零";
     var CN_ONE = "壹";
     var CN_TWO = "贰";
     var CN_THREE = "叁";
     var CN_FOUR = "肆";
     var CN_FIVE = "伍";
     var CN_SIX = "陆";
     var CN_SEVEN = "柒";
     var CN_EIGHT = "捌";
     var CN_NINE = "玖";
     var CN_TEN = "拾";
     var CN_HUNDRED = "佰";
     var CN_THOUSAND = "仟";
     var CN_TEN_THOUSAND = "万";
     var CN_HUNDRED_MILLION = "亿";
     var CN_SYMBOL = "人民币";
     var CN_DOLLAR = "元";
     var CN_TEN_CENT = "角";
     var CN_CENT = "分";
     var CN_INTEGER = "整";
     
    // Variables:
     var integral; // Represent integral part of digit number.
     var decimal; // Represent decimal part of digit number.
     var outputCharacters; // The output result.
     var parts;
     var digits, radices, bigRadices, decimals;
     var zeroCount;
     var i, p, d;
     var quotient, modulus;
     
    // Validate input string:
     currencyDigits = currencyDigits.toString();
     if (currencyDigits == "") {
      alert("Empty input!");
      return "";
     }
     if (currencyDigits.match(/[^,./d]/) != null) {
      alert("Invalid characters in the input string!");
      return "";
     }
     if ((currencyDigits).match(/^((/d{1,3}(,/d{3})*(.((/d{3},)*/d{1,3}))?)|(/d+(./d+)?))$/) == null) {
      alert("Illegal format of digit number!");
      return "";
     }
     
    // Normalize the format of input digits:
     currencyDigits = currencyDigits.replace(/,/g, ""); // Remove comma delimiters.
     currencyDigits = currencyDigits.replace(/^0+/, ""); // Trim zeros at the beginning.
     // Assert the number is not greater than the maximum number.
     if (Number(currencyDigits) > MAXIMUM_NUMBER) {
      alert("Too large a number to convert!");
      return "";
     }
     
    // http://www.knowsky.com/ Process the coversion from currency digits to characters:
     // Separate integral and decimal parts before processing coversion:
     parts = currencyDigits.split(".");
     if (parts.length > 1) {
      integral = parts[0];
      decimal = parts[1];
      // Cut down redundant decimal digits that are after the second.
      decimal = decimal.substr(0, 2);
     }
     else {
      integral = parts[0];
      decimal = "";
     }
     // Prepare the characters corresponding to the digits:
     digits = new Array(CN_ZERO, CN_ONE, CN_TWO, CN_THREE, CN_FOUR, CN_FIVE, CN_SIX, CN_SEVEN, CN_EIGHT,

    CN_NINE);
     radices = new Array("", CN_TEN, CN_HUNDRED, CN_THOUSAND);
     bigRadices = new Array("", CN_TEN_THOUSAND, CN_HUNDRED_MILLION);
     decimals = new Array(CN_TEN_CENT, CN_CENT);
     // Start processing:
     outputCharacters = "";
     // Process integral part if it is larger than 0:
     if (Number(integral) > 0) {
      zeroCount = 0;
      for (i = 0; i < integral.length; i++) {
       p = integral.length - i - 1;
       d = integral.substr(i, 1);
       quotient = p / 4;
       modulus = p % 4;
       if (d == "0") {
        zeroCount++;
       }
       else {
        if (zeroCount > 0)
        {
         outputCharacters += digits[0];
        }
        zeroCount = 0;
        outputCharacters += digits[Number(d)] + radices[modulus];
       }
       if (modulus == 0 && zeroCount < 4) {
        outputCharacters += bigRadices[quotient];
       }
      }
      outputCharacters += CN_DOLLAR;
     }
     // Process decimal part if there is:
     if (decimal != "") {
      for (i = 0; i < decimal.length; i++) {
       d = decimal.substr(i, 1);
       if (d != "0") {
        outputCharacters += digits[Number(d)] + decimals[i];
       }
      }
     }
     // Confirm and return the final output string:
     if (outputCharacters == "") {
      outputCharacters = CN_ZERO + CN_DOLLAR;
     }
     if (decimal == "") {
      outputCharacters += CN_INTEGER;
     }
     outputCharacters = CN_SYMBOL + outputCharacters;
     return outputCharacters;
    }//

     
    166.xml数据岛绑定表格
    <html>
    <body>
    <xml id="abc" src="test.xml"></xml>
    <table border='1' datasrc='#abc'>
    <thead>
    <td>接收人</td>
    <td>发送人</td>
    <td>主题</td>
    <td>内容</td>
    </thead>
    <tfoot>
    <tr><th>表格的结束</th></tr>
    </tfoot>
    <tr>
    <td><div datafld="to"></div></td>
    <td><div datafld="from"></div></td>
    <td><div datafld="subject"></div></td>
    <td><div datafld="content"></div></td>
    </tr>
    </table>
    </body>
    </html>

    //cd_catalog.xml
    <?xml version="1.0" encoding="ISO-8859-1" ?>
     <!--  Edited with XML Spy v4.2
      -->
     <CATALOG>
     <CD>
      <TITLE>Empire Burlesque</TITLE>
      <ARTIST>Bob Dylan</ARTIST>
      <COUNTRY>USA</COUNTRY>
      <COMPANY>Columbia</COMPANY>
      <PRICE>10.90</PRICE>
      <YEAR>1985</YEAR>
      </CD>
     <CD>
      <TITLE>Hide your heart</TITLE>
      <ARTIST>Bonnie Tyler</ARTIST>
      <COUNTRY>UK</COUNTRY>
      <COMPANY>CBS Records</COMPANY>
      <PRICE>9.90</PRICE>
      <YEAR>1988</YEAR>
      </CD>
     <CD>
      <TITLE>Greatest Hits</TITLE>
      <ARTIST>Dolly Parton</ARTIST>
      <COUNTRY>USA</COUNTRY>
      <COMPANY>RCA</COMPANY>
      <PRICE>9.90</PRICE>
      <YEAR>1982</YEAR>
      </CD>
     <CD>
      <TITLE>Still got the blues</TITLE>
      <ARTIST>Gary Moore</ARTIST>
      <COUNTRY>UK</COUNTRY>
      <COMPANY>Virgin records</COMPANY>
      <PRICE>10.20</PRICE>
      <YEAR>1990</YEAR>
      </CD>
    </CATALOG>
    //


    167.以下组合可以正确显示汉字
    ================================
    xml保存编码 xml页面指定编码
    ANSI  gbk/GBK、gb2312
    Unicode  unicode/Unicode
    UTF-8  UTF-8
    ================================

     
    168.XML操作
    <xml id="xmldata" src="/data/books.xml">
    <div id="guoguo"></div>
    <script>
    var x=xmldata.recordset //取得数据岛中的记录集
    if(x.absoluteposition < x.recordcount) //如果当前的绝对位置在最后一条记录之前
    {
     x.movenext();     //向后移动
     x.moveprevious();    //向前移动
     x.absoluteposition=1;   //移动到第一条记录
     x.absoluteposition=x.recordcount;//移动到最后一条记录,注意记录集x.absoluteposition是从1到记录集记录的个

    数的
     guoguo.innerText=xmldso.recordset("field_name"); //从中取出某条记录
    }
    </script>

     
    169.动态修改CSS的另一种方式
    this.runtimeStyle.cssText = "color:#990000;border:1px solid #cccccc";//

    170.正则表达式
    匹配中文字符的正则表达式: [/u4e00-/u9fa5]

    匹配双字节字符(包括汉字在内):[^/x00-/xff]

    应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

    String.prototype.len=function(){return this.replace([^/x00-/xff]/g,"aa").length;}

    匹配空行的正则表达式:/n[/s| ]*/r

    匹配HTML标记的正则表达式:/<(.*)>.*<///1>|<(.*) //>/

    匹配首尾空格的正则表达式:(^/s*)|(/s*$)

    应用:javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现,如下:

    String.prototype.trim = function()
    {
        return this.replace(/(^/s*)|(/s*$)/g, "");
    }

    利用正则表达式分解和转换IP地址:

    下面是利用正则表达式匹配IP地址,并将IP地址转换成对应数值的Javascript程序:

    function IP2V(ip)
    {
     re=/(/d+)/.(/d+)/.(/d+)/.(/d+)/g  //匹配IP地址的正则表达式
    if(re.test(ip))
    {
    return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
    }
    else
    {
     throw new Error("Not a valid IP address!")
    }
    }

    不过上面的程序如果不用正则表达式,而直接用split函数来分解可能更简单,程序如下:

    var ip="10.100.20.168"
    ip=ip.split(".")
    alert("IP值是:"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))

    匹配Email地址的正则表达式:/w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*

    匹配网址URL的正则表达式:http://([/w-]+/.)+[/w-]+(/[/w- ./?%&=]*)?

    //利用正则表达式去除字串中重复的字符的算法程序:

    var s="abacabefgeeii"
    var s1=s.replace(/(.).*/1/g,"$1")
    var re=new RegExp("["+s1+"]","g")
    var s2=s.replace(re,"")
    alert(s1+s2)  //结果为:abcefgi

    思路是使用后向引用取出包括重复的字符,再以重复的字符建立第二个表达式,取到不重复的字符,两者串连。这个方

    法对于字符顺序有要求的字符串可能不适用。

    //得用正则表达式从URL地址中提取文件名的javascript程序,如下结果为page1

    s="http://www.9499.net/page1.htm"
    s=s.replace(/(.*//){0,}([^/.]+).*/ig,"$2")
    alert(s)

    /利用正则表达式限制网页表单里的文本框输入内容:

    用正则表达式限制只能输入中文:οnkeyup="value=value.replace(/[^/u4E00-/u9FA5]/g,'')"

    onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^/u4E00-/u9FA5]/g,'')

    )"

    用正则表达式限制只能输入全角字符: οnkeyup="value=value.replace(/[^/uFF00-/uFFFF]/g,'')"

    onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^/uFF00-/uFFFF]/g,'')

    )"

    用正则表达式限制只能输入数字:οnkeyup="value=value.replace(/[^/d]/g,'')

    "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^/d]/g,''))"

    用正则表达式限制只能输入数字和英文:οnkeyup="value=value.replace(/[/W]/g,'')

    "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^/d]/g,''))"

     
    171.设置和使用cookie
    <HTML>
    <BODY>
    设置与读取 cookies...<BR>
    写入cookie的值<input type=text name=gg>
    <INPUT TYPE = BUTTON Value = "设置cookie" onClick = "Set()">
    <INPUT TYPE = BUTTON Value = "读取cookie" onClick = "Get()"><BR>
    <INPUT TYPE = TEXT NAME = Textbox>
    </BODY>
    <SCRIPT LANGUAGE="JavaScript">
    function Set()
    {
    var Then = new Date()
    Then.setTime(Then.getTime() + 60*1000 ) //60秒
    document.cookie = "Cookie1="+gg.value+";expires="+ Then.toGMTString()
    }

    function Get()
    {
     var cookieString = new String(document.cookie)
     var cookieHeader = "Cookie1="
     var beginPosition = cookieString.indexOf(cookieHeader)
     if (beginPosition != -1)
     {
      document.all.Textbox.value = cookieString.substring(beginPosition  + cookieHeader.length)
     }
     else
      document.all.Textbox.value = "Cookie 未找到!"
    }
    </SCRIPT>
    </HTML>//

     
    172.取月的最后一天
    function getLastDay(year,month)
    {
     //取年
     var new_year = year;
     //取到下一个月的第一天,注意这里传入的month是从1~12
     var new_month = month++;
     //如果当前是12月,则转至下一年
     if(month>12)
     {
      new_month -=12;
      new_year++;
     }
     var new_date = new Date(new_year,new_month,1);
     return (new Date(new_date.getTime()-1000*60*60*24)).getDate();
    }//

    173.判断当前的焦点是组中的哪一个
    for(var i=0;i<3;i++)
     if(event.srcElement==bb[i])
      break;//

    174.实现类
    package com.baosight.view.utils;
    import javax.servlet.jsp.tagext.TagSupport;
    import javax.servlet.http.HttpSession;
    public class Mytag extends TagSupport
    {
      public int doStartTag() throws javax.servlet.jsp.JspException
      {
        boolean canAccess = false;
        HttpSession session= pageContext.getSession();
        if (canAccess)
        {
          return EVAL_BODY_INCLUDE;
        }
        else
        {
          return this.SKIP_BODY;
        }
      }
    }

    175.在web.xml中添加定义
      <taglib>
        <taglib-uri>guoguo</taglib-uri>
        <taglib-location>/WEB-INF/abc.tld</taglib-location>
      </taglib>


    176.标签库中定义abc.tld
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
    "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
    <taglib>
     <tlibversion>1.0</tlibversion>
     <jspversion>1.1</jspversion>
     <shortname>hr</shortname>
     <uri>guoguo</uri>
     <info>Extra 3 Tag Library</info>
     <tag>
      <name>mytag</name>
      <tagclass>com.baosight.view.utils.Mytag</tagclass>
      <attribute>
       <name>id2</name>
       <required>true</required>
                <rtexprvalue>true</rtexprvalue>
      </attribute>
     </tag>
    </taglib>


    177.在使用自定义标签的页面中加入自己定义的标签,
    <%@ taglib uri="guoguo" prefix="guoguo" %>
    //自己定义标签

     
    178.显示带边框的集
    <fieldset style="border:1px gray solid;width:100px">
      <legend>查询条件</legend>
    dfdfdf
    </fieldset>//


    179.【文件(F)】菜单中的命令的实现

    1、〖打开〗命令的实现
    [格式]:document.execCommand("open")
    [说明]这跟VB等编程设计中的webbrowser控件中的命令有些相似,大家也可依此琢磨琢磨。
    [举例]在<body></body>之间加入:
    <a href="###" οnclick=document.execCommand("open")>打开</a>

    2、〖使用 记事本 编辑〗命令的实现
    [格式]:location.replace("view-source:"+location)
    [说明]打开记事本,在记事本中显示该网页的源代码。
    [举例]在<body></body>之间加入:
    <a href="###" οnclick=location.replace("view-source:"+location)>使用记事本编辑</a>

    3、〖另存为〗命令的实现
    [格式]:document.execCommand("saveAs")
    [说明]将该网页保存到本地盘的其它目录!
    [举例]在<body></body>之间加入:
    <a href="###" οnclick=document.execCommand("saveAs")>另存为</a>

    4、〖打印〗命令的实现
    [格式]:document.execCommand("print")
    [说明]当然,你必须装了打印机!
    [举例]在<body></body>之间加入:
    <a href="###" οnclick=document.execCommand("print")>打印</a>

    5、〖关闭〗命令的实现
    [格式]:window.close();return false
    [说明]将关闭本窗口。
    [举例]在<body></body>之间加入:
    <a href="###" οnclick=window.close();return false)>关闭本窗口</a>

    180.【编辑(E)】菜单中的命令的实现

    〖全选〗命令的实现
    [格式]:document.execCommand("selectAll")
    [说明]将选种网页中的全部内容!
    [举例]在<body></body>之间加入:
    <a href="###" οnclick=document.execCommand("selectAll")>全选</a>

    181.【查看(V)】菜单中的命令的实现

    1、〖刷新〗命令的实现
    [格式]:location.reload() 或 history.go(0)
    [说明]浏览器重新打开本页。
    [举例]在<body></body>之间加入:
    <a href="###" οnclick=location.reload()>刷新</a>
    或加入:
    <a href="###" οnclick=history.go(0)>刷新</a>

    2、〖源文件〗命令的实现
    [格式]:location.replace("view-source:"+location)
    [说明]查看该网页的源代码。
    [举例]在<body></body>之间加入:
    <a href="###" οnclick=location.replace("view-source:"+location)>查看源文件</a>

    3、〖全屏显示〗命令的实现
    [格式]:window.open(document.location, "url", "fullscreen")
    [说明]全屏显示本页。
    [举例]在<body></body>之间加入:
    <a href="###" οnclick=window.open(document.location,"url","fullscreen")>全屏显示</a>

    182.【收藏(A)】菜单中的命令的实现

    1、〖添加到收藏夹〗命令的实现
    [格式]:window.external.AddFavorite('url', '“网站名”)
    [说明]将本页添加到收藏夹。
    [举例]在<body></body>之间加入:
    <a href="javascript:window.external.AddFavorite('http://oh.jilinfarm.com', '胡明新的个人主页')">添加到收

    藏夹</a>

    2、〖整理收藏夹〗命令的实现
    [格式]:window.external.showBrowserUI("OrganizeFavorites",null)
    [说明]打开整理收藏夹对话框。
    [举例]在<body></body>之间加入:
    <a href="###" οnclick=window.external.showBrowserUI("OrganizeFavorites",null)>整理收藏夹</a>

    183.【工具(T)】菜单中的命令的实现

    〖internet选项〗命令的实现
    [格式]:window.external.showBrowserUI("PrivacySettings",null)
    [说明]打开internet选项对话框。
    [举例]在<body></body>之间加入:
    <a href="###" οnclick=window.external.showBrowserUI("PrivacySettings",null)>internet选项</a>

    184.【工具栏】中的命令的实现

    1、〖前进〗命令的实现
    [格式]history.go(1) 或 history.forward()
    [说明]浏览器打开后一个页面。
    [举例]在<body></body>之间加入:
    <a href="###" οnclick=history.go(1)>前进</a>
    或加入:
    <a href="###" οnclick=history.forward()>前进</a>

    2、〖后退〗命令的实现
    [格式]:history.go(-1) 或 history.back()
    [说明]浏览器返回上一个已浏览的页面。
    [举例]在<body></body>之间加入:
    <a href="###" οnclick=history.go(-1)>后退</a>
    或加入:
    <a href="###" οnclick=history.back()>后退</a>

    3、〖刷新〗命令的实现
    [格式]:document.reload() 或 history.go(0)
    [说明]浏览器重新打开本页。
    [举例]在<body></body>之间加入:
    <a href="###" οnclick=location.reload()>刷新</a>
    或加入:
    <a href="###" οnclick=history.go(0)>刷新</a>

    185.其它命令的实现
    〖定时关闭本窗口〗命令的实现
    [格式]:settimeout(window.close(),关闭的时间)
    [说明]将关闭本窗口。
    [举例]在<body></body>之间加入:
    <a href="###" οnclick=settimeout(window.close(),3000)>3秒关闭本窗口</a>


    【附】为了方便读者,下面将列出所有实例代码,你可以把它们放到一个html文件中,然后预览效果。
    <a href="###" οnclick=document.execCommand("open")>打开</a><br>
    <a href="###" οnclick=location.replace("view-source:"+location)>使用记事本编辑</a><br>
    <a href="###" οnclick=document.execCommand("saveAs")>另存为</a><br>
    <a href="###" οnclick=document.execCommand("print")>打印</a><br>
    <a href="###" οnclick=window.close();return false)>关闭本窗口</a><br>
    <a href="###" οnclick=document.execCommand("selectAll")>全选</a><br>
    <a href="###" οnclick=location.reload()>刷新</a> <a href="###" οnclick=history.go(0)>刷新</a><br>
    <a href="###" οnclick=location.replace("view-source:"+location)>查看源文件</a><br>
    <a href="###" οnclick=window.open(document.location,"url","fullscreen")>全屏显示</a><br>
    <a href="javascript:window.external.AddFavorite('http://homepage.yesky.com', '天极网页陶吧')">添加到收藏

    夹</a><br>
    <a href="###" οnclick=window.external.showBrowserUI("OrganizeFavorites",null)>整理收藏夹</a><br>
    <a href="###" οnclick=window.external.showBrowserUI("PrivacySettings",null)>internet选项</a><br>
    <a href="###" οnclick=history.go(1)>前进1</a> <a href="###" οnclick=history.forward()>前进2</a><br>
    <a href="###" οnclick=history.go(-1)>后退1</a> <a href="###" οnclick=history.back()>后退2</a><br>
    <a href="###" οnclick=settimeout(window.close(),3000)>3秒关闭本窗口</a><br>

     
    186.给DHTML中的标签添加一个新的属性,可以随意加
    <BODY οnlοad="alert(a1.epass)">
    <input type=text name="a1" epass="zhongguo">
    </BODY>//

     
    187.xmlhttp技术
    <BODY> 此方法是通过XMLHTTP对象从服务器获取XML文档,示例如下。
     <input type=button value="加载XML文档" οnclick="getData('data.xml')" >
     <script language="JavaScript" >
     function getDatal(url){
     var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");//创建XMLHTTPRequest对象
     xmlhttp.open("GET",url,false,"","");//使用HTTP GET初始化HTTP请求
     xmlhttp.send("");//发送HTTP请求并获取HTTP响应
     return xmlhttp.responseXML;//获取XML文档
     }
     </script >
    </BODY>//

    188.服务器端通过request.getReader()获得传入的字符串

    189.在java中使用正则表达式
    java.util.regex.Pattern p =

    java.util.regex.Pattern.compile("//d+|.//d+|//d+.//d*|(E|//d+E|.//d+E|//d+.//d*E)((//+|-)//d|//d)//d*");
    java.util.regex.Matcher m = p.matcher("12.E+3");
    boolean result = m.matches();//

     
    190.给下拉框分组
    <SELECT>
    <OPTGROUP LABEL="碱性金属">
    <OPTION>锂 (Li)</OPTION>
    <OPTION>纳 (Na)</OPTION>
    <OPTION>钾 (K)</OPTION>
    </OPTGROUP>
    <OPTGROUP LABEL="卤素">
    <OPTION>氟 (F)</OPTION>
    <OPTION>氯 (Cl)</OPTION>
    <OPTION>溴 (Br)</OPTION>
    </OPTGROUP>
    </SELECT>//

    191.加注音
    <RUBY>
    基准文本
    <RT>注音文本
    </RUBY>//

     
    192.加删除线
    <S>此文本将带删除线显示。</S>//

    193.取frame中的event事件
    document.frames("workspace").event.keyCode//

    194.是弹出方法的定义
    String.prototype.trim=function()
    {
     return this.replace(/(^/s*)|(/s*$)/g, "");
    }
    alert("  ".trim)//
     

    195.防止网页被包含
    if (window != window.top)
    top.location.href = location.href;//

     
    196.让网页一直在frame里面
    if(window==window.top)
    {
     document.body.innerHTML="<center><h1>请通过正常方式访问本页面!</h1></center>";
     //window.close();
    }//

     
    197.加为首页
    <SCRIPT>
    function fnSet(){
    oHomePage.setHomePage(location.href);
    event.returnValue = false;
    }
    </SCRIPT>
    <IE:HOMEPAGE ID="oHomePage" style="behavior:url(#default#homepage)"/>//

     
    198.xml数据岛操作
    <HTML>
      <HEAD><Title>HTML中的数据岛中的记录集</Title></HEAD>
      <body bkcolor=#EEEEEE text=blue bgcolor="#00FFFF">
      <Table align=center width="100%"><TR><TD align="center">
      <h5><b><font size="4" color="#FF0000">HTML中的XML数据岛记录编辑与添加    </font></b></h5>
      </TD></TR></Table>
      <HR>
      酒店名称:<input type=text datasrc=#theXMLisland DataFLD=NAME size="76"><BR>
      地址:<input type=text datasrc=#theXMLisland DataFLD=Address size="76"><BR>
      主页:<input type=text datasrc=#theXMLisland DataFLD=HomePage size="76"><BR>
      电子邮件:<input type=text datasrc=#theXMLisland DataFLD=E-Mail size="76"><BR>
      电话:<input type=text datasrc=#theXMLisland DataFLD=TelePhone size="76"><BR>
      级别:<input type=text datasrc=#theXMLisland DataFLD=Grade size="76"><HR>
      <input id="first" TYPE=button value="<< 第一条记录"     οnclick="theXMLisland.recordset.moveFirst()">
      <input id="prev" TYPE=button value="<上一条记录"   οnclick="theXMLisland.recordset.movePrevious()">
      <input id="next" TYPE=button value="下一条记录>" οnclick="theXMLisland.recordset.moveNext()">
      <input id="last" TYPE=button value="最后一条记录>>" οnclick="theXMLisland.recordset.moveLast()">&nbsp;
      <input id="Add" TYPE=button value="添加新记录" οnclick="theXMLisland.recordset.addNew()">

      <XML ID="theXMLisland">
      <HotelList>
      <Hotel>
      <Name>四海大酒店</Name>
      <Address>海魂路1号</Address>
      <HomePage>www.sihaohotel.com.cn</HomePage>
      <E-Mail>master@sihaohotel.com.cn</E-Mail>
      <TelePhone>(0989)8888888</TelePhone>
      <Grade>五星级</Grade>
      </Hotel>
      <Hotel>
      <Name>五湖宾馆</Name>
      <Address>东平路99号</Address>
      <HomePage>www.wuhu.com.cn</HomePage>
      <E-Mail>web@wuhu.com.cn</E-Mail>
      <TelePhone>(0979)1111666</TelePhone>
      <Grade>四星级</Grade>
      </Hotel>
      <Hotel>
      <Name>“大沙漠”宾馆</Name>
      <Address>留香路168号</Address>
      <HomePage>www.dashamohotel.com.cn</HomePage>
      <E-Mail>master@dashamohotel.com.cn</E-Mail>
      <TelePhone>(0989)87878788</TelePhone>
      <Grade>五星级</Grade>
      </Hotel>
      <Hotel>
      <Name>“画眉鸟”大酒店</Name>
      <Address>血海飘香路2号</Address>
      <HomePage>www.throstlehotel.com.cn</HomePage>
      <E-Mail>chuliuxiang@throstlehotel.com.cn</E-Mail>
      <TelePhone>(099)9886666</TelePhone>
      <Grade>五星级</Grade>
      </Hotel>
      </HotelList>
      </XML>

      </body>
      </HTML> //xml数据岛中添加记录


    -------------------------------
      The following list is a sample of the properties and methods that you use to access nodes in an XML

    document.

    Property/    Method Description
    XMLDocument Returns a reference to the XML Document Object Model (DOM) exposed by the object.

    documentElement  Returns the document root of the XML document.
    childNodes    Returns a node list containing the children of a node (if any).
    item     Accesses individual nodes within the list through an index. Index values are zero-based, so

    item(0) returns the first child node.
    text     Returns the text content of the node.

    The following code shows an HTML page containing an XML data island. The data island is contained within

    the <XML> element.

    <HTML>
      <HEAD>
        <TITLE>HTML with XML Data Island</TITLE>
      </HEAD>
      <BODY>
        <P>Within this document is an XML data island.</P>

        <XML ID="resortXML">
          <resorts>
            <resort code='1'>Adventure Works</resort>
            <resort>Alpine Ski House</resort>
          </resorts>
        </XML>

      </BODY>
    </HTML>
    For an example, you can cut and paste this sample line of code:

    resortXML.XMLDocument.documentElement.childNodes.item(1).text//读取页面上的XML数据岛中的数据
    resortXML.documentElement.childNodes.item(0).getAttribute("code")//读取页面上的XML数据岛中的数据
    resortXML.documentElement.childNodes[0].getAttribute("code")//读取页面上的XML数据岛中的数据

    199.模式窗口
    父窗口
    var url="aaa.jsp";
    var

    data=showModalDialog(url,null,"dialogHeight:400px;dialogHeight:600px;center:yes;help:No;status:no;resizab

    le:Yes;edge:sunken");
    if(data)
     alert(data.value);
     
    子窗口
    var data=new Object();
    data.value1="china";
    window.returnValue=data;
    window.close();

     
    200.动态设置事件,带参数
    <INPUT TYPE="text" NAME="a1">
    <SCRIPT LANGUAGE="JavaScript">
    <!--
    function hah(para)
    {
     alert(para)
    }
    a1.οnclick=function()
    {
     hah('canshu ')
    }
    //a1.attachEvent("onclick",function(){hah('参数')});
    //-->
    </SCRIPT>//

     
    201.将url转化为16进制形式
     var ret = '';

     for(var i=0; i < str.length; i++)
     {
      var ch = str.charAt(i);
      var code = str.charCodeAt(i);

      if(code < 128 && ch != '[' && ch != '/'' && ch != '=')
      {
       ret += ch;
      }
      else
      {
       ret += "[" + code.toString(16) + "]";
      }
     }
     return ret;//
     

    202.打开新的窗口并将新打开的窗口设置为活动窗口
    var newWin=window.open("xxxx");
    newWin.focus();//

     
    /*
    203.容错脚本
    JS中遇到脚本错误时不做任何操作:window.onerror = doNothing;
    指定错误句柄的语法为:window.onerror = handleError
    */
    function handleError(message, URI, line)
    {// 提示用户,该页可能不能正确回应
    return true; // 这将终止默认信息
    }//在页面出错时进行操作

    /* 204.JS中的窗口重定向: */
    window.navigate("http://www.sina.com.cn");//

    /* 205.防止链接文字折行 */
    document.body.noWrap=true;//

    /* 206.判断字符是否匹配. */
    string.match(regExpression)//

    /* 207. */
    href="javascript:document.Form.Name.value='test';void(0);"//不能用onClick="javacript:document.Form.Name.v

    alue='test';return false;"

    /*
    当使用inline方式添加事件处理脚本事,有一个被包装成匿名函数的过程,也就是说
    onClick="javacript:document.Form.Name.value='test';return false;"被包装成了:
    */
    function anonymous()
    {
        document.Form.Name.value='test';
     return false;
    }
    /*
    做为A的成员函数onclick。
    而href="javascript:document.Form.Name.value='test';void(0);"相当于执行全局语句,这时如果使用return语句会
    报告在函数外使用return语句的错误。
    */

    /*
    208.进行页面放大
    <P οnmοuseοver="this.style.zoom='200%'" οnmοuseοut="this.style.zoom='normal'">
    sdsdsdsdsdsdsdsds
    </p>//
    */
    /*
    209.放置在页面的最右边
    <input type="text" value='bu2'  style="float:right">//
    */

    /* 210.通过style来控制隔行显示不同颜色 */
    /*
    <style>
    tr{
    bgcolor:expression_r(this.bgColor=((this.rowIndex)%2==0 )? 'white' : 'yellow');
    }
    </style>
    <table id="oTable" width="100" border="1" style="border-collapse:collapse;">
    <tr><td>&nbsp;</td></tr>
    <tr><td>&nbsp;</td></tr>
    <tr><td>&nbsp;</td></tr>
    <tr><td>&nbsp;</td></tr>
    <tr><td>&nbsp;</td></tr>
    </table>
    */

    211.全屏最大化
    newwindow=window.open("","","scrollbars")
    if (document.all)
    {
     newwindow.moveTo(0,0)
     newwindow.resizeTo(screen.width,screen.height)
    }//

    /* 212.根据名字解析xml中的节点值 */
    var XMLDoc=new ActiveXObject("MSXML");
    XMLDoc.url="d:/abc.xml";
    aRoot=XMLDoc.root;
    a1.innerText=aRoot.children.item("name").text;//

     
    /* 213.在页面上解析xml的值 */
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/html/5996c682-3472-4b03-9fb0-1e08

    fcccdf35.asp
    //

    /* 214.看一个字符串里面有多少个回车符,返回值是一个数组 */
    var s=value.match(//n/g);if(s)if(s.length==9){alert('10行了');return false;}//

    /* 215.获得asc码 */
    var s='aa';
    alert(s.charCodeAt(1))//
     
    /* 216.文字居右对齐 */
    <input type="text" value="123" style="text-align:right">//

    /* 217.判断一个方法是否存在 */
    function pageCallback(response){
     alert(response);
    }
    if(pageCallback)
     alert(1)//

     
    /* 218.判断一个变量是否定义 */
    if(typeof(a)=="undefined")
    {
     alert()
    }//

     
    /* 219.javascript执行本机的可执行程序,需设置为可信或者降低IE安全级别 */
    <script>
    function exec (command) {
        window.oldOnError = window.onerror;
        window._command = command;
        window.onerror = function (err) {
          if (err.indexOf('utomation') != -1) {
            alert('命令已经被用户禁止!');
            return true;
          }
          else return false;
        };
        var wsh = new ActiveXObject('WScript.Shell');
        if (wsh)
          wsh.Run(command);
        window.onerror = window.oldOnError;
      }
    </script>
    调用方式
    <a href="javascript:" οnclick="exec('D:/test.bat')">测试</a>//
     
    220.弹出新页面,关闭旧页面,不弹出提示框
     var w=screen.availWidth-10;
       var h=screen.availHeight-10;
       var swin=window.open("/mc/mc/message_management.jsp",

    "BGSMbest","scrollbars=yes,status,location=0,menubar=0,toolbar=0,resizable=no,top=0,left=0,height="+h+",w

    idth="+w);
       window.opener=null;
       window.close();//

    221.能输入的下拉框
    <span>
    <input name="Department1" id="Department1" style=" border-right:0;width:130" >
    <span style="width:150;overflow:hidden">
    <select  style="width:150;margin-left:-130" onChange="Department1.value=value">
    <option value=""></option>
    <option value="asdfasfadf">asdfasfadf</option>
    <option value="546546">546546</option></select> //

     
    222.在方法中定义全局变量
    function globalVar (script) {
            eval_r(script);//all navigators
      //window.execScript(script); //for ie only
    }
    globalVar('window.haha = "../system";');
    alert(haha);//在方法中定义全局变量,其中的haha就是全局变量了

    223.显示一个对象的全部的属性和属性的值
    var a=new Object();
    a.name='a1';
    a.***='mail'
    for(var p in a)
    {
     alert(p+"="+a[p])
    }//

     
    224.16进制转换成10进制
    var n = parseInt("2AE",16);//这里将16进制的 2AE 转成 10 进制数,得到 n 的值是 686


    225.复制粘贴
    <BODY>
    <input type="file" name='a1'><input type="button" value='复制粘贴' οnclick="haha()"><div id="aa"></div>
    <SCRIPT LANGUAGE="JavaScript">
    <!--
    function haha()
    {
     clipboardData.setData("Text",a1.value);
     aa.innerText=clipboardData.getData("Text");
    }
    //-->
    </SCRIPT>
    </BODY>//

    226.获得对象类型
    switch (object.constructor){
       case Date:
       ...
       case Number:
       ...
       case String:
       ...
       case MyObject:
       ...
       default:
       ...
    }//

     
    227.图片加载失败时重新加载图片
    <img src="aa.gif" aa.gif'">//
     
    228.
    //font_effect.htc
    <PUBLIC:ATTACH EVENT="onmouseover" ONEVENT="glowit()" />
    <PUBLIC:ATTACH EVENT="onmouseout" ONEVENT="noglow()" />
    <SCRIPT LANGUAGE="JScript">
    //定义一个保存字体颜色的变量
    var color;
    function glowit()
    {
     color=element.style.backgroundColor;
     element.style.backgroundColor='white'
    }
    function noglow()
    {
      element.style.backgroundColor=color
    }
    </SCRIPT>

    //abc.css
    tr{behavior:url(font_effect.htc);}

    229.可以通过css和htc改变表格的颜色,仅IE支持
    //xxx.html
    <link rel="stylesheet" type="text/css" href="abc.css">
    <TABLE border='1'  id="a1">
    <TR style="background-color:red">
     <TD>1</TD>
     <TD>2</TD>
     <TD>3</TD>
    </TR>
    <TR style="background-color:yellow">
     <TD>4</TD>
     <TD>5</TD>
     <TD>6</TD>
    </TR>
    </TABLE>//

    230.在页面上画点
    function a(x,y,color)
    {
     document.write("<img border='0' style='position: absolute; left: "+(x+20)+"; top:

    "+(y+20)+";background-color: "+color+"' width=1 height=1>")
    }//

     231.自动关闭网页
    <script LANGUAGE="javascript">
    <!--
    setTimeout('window.close();', 10000); //60秒后关闭
    // -->
    </script>
    <p align="center">本页10秒后自动关闭,请注意刷新页面</p>

    *************************************************************************************
     
    函数收藏


     程序代码

    '*******************************************************************
    '检测是否是手机浏览
    '*******************************************************************
    <%
    if instr(request.ServerVariables("HTTP_USER_AGENT"),"Mozilla")=0 then
    response.redirect "/wap" '如果客户端为手机访问,则进入/wap目录
    else
    response.redirect "http://wap.hxblog.net"' 如果客户端不是手机访问,则进入指定地址
    end if
    %>


     程序代码
    '*******************************************************************
    '取得IP地址
    '*******************************************************************
    Function Userip()
    Dim GetClientIP
    '如果客户端用了代理服务器,则应该用ServerVariables("HTTP_X_FORWARDED_FOR")方法
    GetClientIP = Request.ServerVariables("HTTP_X_FORWARDED_FOR")
    If GetClientIP = "" or isnull(GetClientIP) or isempty(GetClientIP) Then
    '如果客户端没用代理,应该用Request.ServerVariables("REMOTE_ADDR")方法
    GetClientIP = Request.ServerVariables("REMOTE_ADDR")
    end if
    Userip = GetClientIP
    End function


     程序代码
    '*******************************************************************
    ' 弹出对话框
    '*******************************************************************
    Sub alert(message)
    message = replace(message,"'","/'")
    Response.Write ("<script>alert('" & message & "')</script>")
    End Sub
     


     程序代码
    '*******************************************************************
    ' 返回上一页,一般用在判断信息提交是否完全之后
    '*******************************************************************
    Sub GoBack()
    Response.write ("<script>history.go(-1)</script>")
    End Sub
     


     程序代码
    '*******************************************************************
    ' 重定向另外的连接
    '*******************************************************************
    Sub Go(url)
    Response.write ("<script>location.href('" & url & "')</script>")
    End Sub

     

     程序代码
    '*******************************************************************
    ' 指定秒数重定向另外的连接
    '*******************************************************************
    sub GoPage(url,s)
    s=s*1000
    Response.Write "<SCRIPT LANGUAGE=JavaScript>"
    Response.Write "window.setTimeout("&chr(34)&"window.navigate('"&url&"')"&chr(34)&","&s&")"
    Response.Write "</script>"
    end sub


     程序代码
    '*******************************************************************
    ' 判断数字是否整形
    '*******************************************************************
    function isInteger(para)
    on error resume next
    dim str
    dim l,i
    if isNUll(para) then
    isInteger=false
    exit function
    end if
    str=cstr(para)
    if trim(str)="" then
    isInteger=false
    exit function
    end if
    l=len(str)
    for i=1 to l
    if mid(str,i,1)>"9" or mid(str,i,1)<"0" then
    isInteger=false
    exit function
    end if
    next
    isInteger=true
    if err.number<>0 then err.clear
    end function

     

     程序代码
    '*******************************************************************
    ' 获得文件扩展名
    '*******************************************************************
    function GetExtend(filename)
    dim tmp
    if filename<>"" then
    tmp=mid(filename,instrrev(filename,".")+1,len(filename)-instrrev(filename,"."))
    tmp=LCase(tmp)
    if instr(1,tmp,"asp")>0 or instr(1,tmp,"php")>0 or instr(1,tmp,"php3")>0 or instr(1,tmp,"aspx")>0 then
    getextend="txt"
    else
    getextend=tmp
    end if
    else
    getextend=""
    end if
    end function

     

     程序代码
    ' *----------------------------------------------------------------------------
    ' * 函数:CheckIn
    ' * 描述:检测参数是否有SQL危险字符
    ' * 参数:str要检测的数据
    ' * 返回:FALSE:安全 TRUE:不安全
    ' * 作者:
    ' * 日期:
    ' *----------------------------------------------------------------------------
    function CheckIn(str)
    if instr(1,str,chr(39))>0 or instr(1,str,chr(34))>0 or instr(1,str,chr(59))>0 then
    CheckIn=true
    else
    CheckIn=false
    end if
    end function


     程序代码
    ' *----------------------------------------------------------------------------
    ' * 函数:HTMLEncode
    ' * 描述:过滤HTML代码
    ' * 参数:--
    ' * 返回:--
    ' * 作者:
    ' * 日期:
    ' *----------------------------------------------------------------------------
    function HTMLEncode(fString)
    if not isnull(fString) then
    fString = replace(fString, ">", ">")
    fString = replace(fString, "<", "<")

    fString = Replace(fString, CHR(32), " ")
    fString = Replace(fString, CHR(9), " ")
    fString = Replace(fString, CHR(34), """)
    fString = Replace(fString, CHR(39), "'")
    fString = Replace(fString, CHR(13), "")
    fString = Replace(fString, CHR(10) & CHR(10), "</P><P> ")
    fString = Replace(fString, CHR(10), "<BR> ")

    HTMLEncode = fString
    end if
    end function


     程序代码
    '*----------------------------------------------------------------------------
    ' * 函数:HTMLcode
    ' * 描述:过滤表单字符
    ' * 参数:--
    ' * 返回:--
    ' * 作者:
    ' * 日期:
    ' *----------------------------------------------------------------------------
    function HTMLcode(fString)
    if not isnull(fString) then
    fString = Replace(fString, CHR(13), "")
    fString = Replace(fString, CHR(10) & CHR(10), "</P><P>")
    fString = Replace(fString, CHR(34), "")
    fString = Replace(fString, CHR(10), "<BR>")
    HTMLcode = fString
    end if
    end function


    so cool 菜单(Jave)

     程序代码
    <style>
    body{
    background-color:#B8B8A0;
    }
    #fbtn{
    display:none;
    overflow:hidden;
    border-style:solid;
    border-width:1px;
    border-color:#e1e1c9 #e1e1c9 #6e6e56 #6e6e56;
    padding:1 1 1 1;
    width:115px;
    height:30px;
    }
    #fbtn_txt{
    position:relative;
    }
    #fbtn_txt div{
    height:30px;
    padding-top:11px;
    font-size:9px;
    font-family:small fonts;
    color:#800080;
    text-align:center;
    cursor:hand;
    }
    #fbtn_mask{
    background-color:#ffffff;
    position:relative;
    width:100%;
    height:100%;
    }
    </style>

    <div id=fbtn>
    <div id=fbtn_mask></div>
    <div id=fbtn_txt>
    <div>G1</div>
    <div>good morning</div>
    </div>
    </div>
    <div id=fbtn>
    <div id=fbtn_mask></div>
    <div id=fbtn_txt>
    <div>G2</div>
    <div>good evening</div>
    </div>
    </div>
    <div id=fbtn>
    <div id=fbtn_mask></div>
    <div id=fbtn_txt>
    <div>M1</div>
    <div>my name is mozart0</div>
    </div>
    </div>
    <div id=fbtn>
    <div id=fbtn_mask></div>
    <div id=fbtn_txt>
    <div>M2</div>
    <div>mm mm i love u</div>
    </div>
    </div>
    <div id=fbtn>
    <div id=fbtn_mask></div>
    <div id=fbtn_txt>
    <div>G1</div>
    <div>good morning</div>
    </div>
    </div>
    <div id=fbtn>
    <div id=fbtn_mask></div>
    <div id=fbtn_txt>
    <div>G2</div>
    <div>good evening</div>
    </div>
    </div>
    <div id=fbtn>
    <div id=fbtn_mask></div>
    <div id=fbtn_txt>
    <div>M1</div>
    <div>my name is mozart0</div>
    </div>
    </div>
    <div id=fbtn>
    <div id=fbtn_mask></div>
    <div id=fbtn_txt>
    <div>M2</div>
    <div>mm mm i love u</div>
    </div>
    </div>

    <script>
    var current=null;
    for(var i=0;i<fbtn.length;i++){
    fbtn_txt[i].style.posTop=-30;
    fbtn_mask[i].style.posTop=-30;
    fbtn[i].index=i;
    fbtn[i].style.display="block";
    fbtn[i].οnmοuseοver=function(){
    if(!current){
    current=this;
    domove(this.index);
    }
    else if(current!=this){
    domove(current.index);
    domove(this.index);
    current=this;
    }
    }
    fbtn[i].οnmοuseοut=function(){
    if(event.toElement==this.parentElement&¤t==this){
    domove(this.index);
    current=null;
    }
    }
    }
    function domove(num){
    var o=fbtn_txt[num];
    var m=fbtn_mask[num];
    if(o.style.posTop<-60){
    o.style.display="none";
    var t=o.children[1].innerHTML;
    o.children[1].innerHTML=o.children[0].innerHTML;
    o.children[0].innerHTML=t;
    o.style.posTop=-30;
    o.style.display="block";
    if(m.style.posTop>30)
    m.style.posTop=-30;
    else
    m.style.posTop=0;
    }
    else{
    m.style.posTop+=3;
    o.style.posTop-=3;
    setTimeout('domove('+num+')',15);
    }
    }
    </script>

    >>>---------我想分页!--这么长的文章,在这里来个分页多好啊!哈哈----------<<<
    《几个常用的ASP代码&FSO》
    1.获得系统时间:
    <%=now()%>

    2.取得来访用的IP:
    <%=request.serverVariables("remote_host")%>

    3.获得系统,浏览器版本:
    <script>
    window.document.write("版本:"+navigator.appName+navigator.appVersion+" browser.")
    </script>

    4.去除IE混动条:
    <body scroll="no">
    <body style="overflow-y:hidden">

    5.进入网站,跳出广告:
    <script language="javascript">
    <!--
    <!-- 注意更改文件所在路径-->
    window.open('http://www.XXXXXX.com' ,'','height=200,width=300,top=0,left=30');
    // -->
    </script>

    6.随机数:
    <%randomize%>
    <%=(int(rnd()*n)+1)%>
    N为可改变数

    7.向上混动代码:
    <marquee direction="up" scrolldelay="200" style="font-size: 9pt; color: #FF0000; line-height: 150%; font-style:italic; font-weight:bold" scrollamount="2" width="206" height="207" bgcolor="#FFFF00">hhhhhhhhhhhhhhhhhhh</marquee>

    8.自动关闭网页:
    <script LANGUAGE="javascript">
    <!--
    setTimeout('window.close();', 10000); //60秒后关闭
    // -->
    </script>
    <p align="center">本页10秒后自动关闭,请注意刷新页面</p>

    9.随机背景音乐:
    <%randomize%>
    <bgsound src="mids/<%=(int(rnd()*60)+1)%>.mid" loop="-1">
    可以修改数字,限制调用个数,我这里是60个.

    10.自动刷新本页面:
    <script>
    <!--

    var limit="0:10"

    if (document.images){
    var parselimit=limit.split(":")
    parselimit=parselimit[0]*60+parselimit[1]*1
    }
    function beginrefresh(){
    if (!document.images)
    return
    if (parselimit==1)
    window.location.reload()
    else{
    parselimit-=1
    curmin=Math.floor(parselimit/60)
    cursec=parselimit`
    if (curmin!=0)
    curtime=curmin+"分"+cursec+"秒后重刷本页!"
    else
    curtime=cursec+"秒后重刷本页!"
    window.status=curtime
    setTimeout("beginrefresh()",1000)
    }
    }

    window.οnlοad=beginrefresh
    file://-->
    </script>

    11.ACCESS数据库连接:
    <%
    option explicit
    dim startime,endtime,conn,connstr,db
    startime=timer()
    '更改数据库名字
    db="data/dvBBS5.mdb"
    Set conn = Server.CreateObject("ADODB.Connection")
    connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(db)
    '如果你的服务器采用较老版本Access驱动,请用下面连接方法
    'connstr="driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath(db)
    conn.Open connstr
    function CloseDatabase
    Conn.close
    Set conn = Nothing
    End Function
    %>

    12.SQL数据库连接:
    <%
    option explicit
    dim startime,endtime,conn,connstr,db
    startime=timer()
    connstr="driver={SQL Server};server=HUDENQ-N11T33NB;uid=sa;pwd=xsfeihu;database=dvbbs"
    Set conn = Server.CreateObject("ADODB.Connection")
    conn.Open connstr
    function CloseDatabase
    Conn.close
    Set conn = Nothing
    End Function
    %>

    13.用键盘打开网页代码:
    <script language="javascript">
    function ctlent(eventobject)
    {
    if((event.ctrlKey && window.event.keyCode==13)||(event.altKey && window.event.keyCode==83))
    {
    window.open('网址','','')
    }
    }
    </script>

    这里是Ctrl+Enter和Alt+S的代码 自己查下键盘的ASCII码再换就行

    14.让层不被控件复盖代码:
    <div z-Index:2><object xxx></object></div> # 前面
    <div z-Index:1><object xxx></object></div> # 后面
    <div id="Layer2" style="position:absolute; top:40;width:400px; height:95px;z-index:2"><table height=100% width=100% bgcolor="#ff0000"><tr><td height=100% width=100%></td></tr></table><iframe width=0 height=0></iframe></div>
    <div id="Layer1" style="position:absolute; top:50;width:200px; height:115px;z-index:1"><iframe height=100% width=100%></iframe></div>

    15.动网FLASH广告代码:
    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/sho ... h/swflash.cab#version=5 ,0,0,0" width="468" height="60"><param name=movie value="images/yj16d.swf"><param name=quality value=high><embed src="images/dvbanner.swf" quality=high pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash";;;;;;;;;;;;type="app ... "height="60"></embed></object>

    16.VBS弹出窗口小代码:
    <script language=vbscript>
    msgbox"你还没有注册或登陆论坛","0","精品论坛"
    location.href = "login.asp"
    </script>

    16.使用FSO修改文件特定内容的函数
    function FSOchange(filename,Target,String)
    Dim objFSO,objCountFile,FiletempData
    Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
    Set objCountFile = objFSO.OpenTextFile(Server.MapPath(filename),1,True)
    FiletempData = objCountFile.ReadAll
    objCountFile.Close
    FiletempData=Replace(FiletempData,Target,String)
    Set objCountFile=objFSO.CreateTextFile(Server.MapPath(filename),True)
    objCountFile.Write FiletempData
    objCountFile.Close
    Set objCountFile=Nothing
    Set objFSO = Nothing
    End Function

    17.使用FSO读取文件内容的函数
    function FSOFileRead(filename)
    Dim objFSO,objCountFile,FiletempData
    Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
    Set objCountFile = objFSO.OpenTextFile(Server.MapPath(filename),1,True)
    FSOFileRead = objCountFile.ReadAll
    objCountFile.Close
    Set objCountFile=Nothing
    Set objFSO = Nothing
    End Function

    18.使用FSO读取文件某一行的函数
    function FSOlinedit(filename,lineNum)
    if linenum < 1 then exit function
    dim fso,f,temparray,tempcnt
    set fso = server.CreateObject("scripting.filesystemobject")
    if not fso.fileExists(server.mappath(filename)) then exit function
    set f = fso.opentextfile(server.mappath(filename),1)
    if not f.AtEndofStream then
    tempcnt = f.readall
    f.close
    set f = nothing
    temparray = split(tempcnt,chr(13)&chr(10))
    if lineNum>ubound(temparray)+1 then
    exit function
    else
    FSOlinedit = temparray(lineNum-1)
    end if
    end if
    end function

    19.使用FSO写文件某一行的函数
    function FSOlinewrite(filename,lineNum,Linecontent)
    if linenum < 1 then exit function
    dim fso,f,temparray,tempCnt
    set fso = server.CreateObject("scripting.filesystemobject")
    if not fso.fileExists(server.mappath(filename)) then exit function
    set f = fso.opentextfile(server.mappath(filename),1)
    if not f.AtEndofStream then
    tempcnt = f.readall
    f.close
    temparray = split(tempcnt,chr(13)&chr(10))
    if lineNum>ubound(temparray)+1 then
    exit function
    else
    temparray(lineNum-1) = lineContent
    end if
    tempcnt = join(temparray,chr(13)&chr(10))
    set f = fso.createtextfile(server.mappath(filename),true)
    f.write tempcnt
    end if
    f.close
    set f = nothing
    end function

    20.使用FSO添加文件新行的函数
    function FSOappline(filename,Linecontent)
    dim fso,f
    set fso = server.CreateObject("scripting.filesystemobject")
    if not fso.fileExists(server.mappath(filename)) then exit function
    set f = fso.opentextfile(server.mappath(filename),8,1)
    f.write chr(13)&chr(10)&Linecontent
    f.close
    set f = nothing
    end function

    21.读文件最后一行的函数
    function FSOlastline(filename)
    dim fso,f,temparray,tempcnt
    set fso = server.CreateObject("scripting.filesystemobject")
    if not fso.fileExists(server.mappath(filename)) then exit function
    set f = fso.opentextfile(server.mappath(filename),1)
    if not f.AtEndofStream then
    tempcnt = f.readall
    f.close
    set f = nothing
    temparray = split(tempcnt,chr(13)&chr(10))
    FSOlastline = temparray(ubound(temparray))
    end if
    end function
    >>>---------我想分页!--这么长的文章,在这里来个分页多好啊!哈哈----------<<<
    1. οncοntextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键
    <table border οncοntextmenu=return(false)><td>no</table> 可用于Table

    2. <body onselectstart="return false"> 取消选取、防止复制

    3. οnpaste="return false" 不准粘贴

    4. οncοpy="return false;" oncut="return false;" 防止复制

    5. <link rel="Shortcut Icon" href="favicon.ico"> IE地址栏前换成自己的图标

    6. <link rel="Bookmark" href="favicon.ico"> 可以在收藏夹中显示出你的图标

    7. <input style="ime-mode:disabled"> 关闭输入法

    8. 永远都会带着框架
    <script language="JavaScript"><!--
    if (window == top)top.location.href = "frames.htm"; //frames.htm为框架网页
    // --></script>

    9. 防止被人frame
    <SCRIPT LANGUAGE=JAVASCRIPT><!--
    if (top.location != self.location)top.location=self.location;
    // --></SCRIPT>

    10. 网页将不能被另存为
    <noscript><iframe src=*.html></iframe></noscript>

    11. <input type=button value=查看网页源代码
    οnclick="window.location = "view-source:"+ "http://www.pconline.com.cn"">

    12.删除时确认
    <a href="javascript :if(confirm("确实要删除吗?"))location="boos.asp?&areyou=删除&page=1"">删除</a>

    13. 取得控件的绝对位置
    //Javascript
    <script language="Javascript">
    function getIE(e){
    var t=e.offsetTop;
    var l=e.offsetLeft;
    while(e=e.offsetParent){
    t+=e.offsetTop;
    l+=e.offsetLeft;
    }
    alert("top="+t+"/nleft="+l);
    }
    </script>

    //VBScript
    <script language="VBScript"><!--
    function getIE()
    dim t,l,a,b
    set a=document.all.img1
    t=document.all.img1.offsetTop
    l=document.all.img1.offsetLeft
    while a.tagName<>"BODY"
    set a = a.offsetParent
    t=t+a.offsetTop
    l=l+a.offsetLeft
    wend
    msgbox "top="&t&chr(13)&"left="&l,64,"得到控件的位置"
    end function
    --></script>

    14. 光标是停在文本框文字的最后
    <script language="javascript">
    function cc()
    {
    var e = event.srcElement;
    var r =e.createTextRange();
    r.moveStart("character",e.value.length);
    r.collapse(true);
    r.select();
    }
    </script>
    <input type=text name=text1 value="123" οnfοcus="cc()">

    15. 判断上一页的来源
    javascript :
    document.referrer

    16. 最小化、最大化、关闭窗口
    <object id=hh1 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">
    <param name="Command" value="Minimize"></object>
    <object id=hh2 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">
    <param name="Command" value="Maximize"></object>
    <OBJECT id=hh3 classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11">
    <PARAM NAME="Command" VALUE="Close"></OBJECT>
    <input type=button value=最小化 οnclick=hh1.Click()>
    <input type=button value=最大化 οnclick=hh2.Click()>
    <input type=button value=关闭 οnclick=hh3.Click()>
    本例适用于IE

    17.屏蔽功能键Shift,Alt,Ctrl
    <script>
    function look(){
    if(event.shiftKey)
    alert("禁止按Shift键!"); //可以换成ALT CTRL
    }
    document.οnkeydοwn=look;
    </script>

    18. 网页不会被缓存
    <META HTTP-EQUIV="pragma" CONTENT="no-cache">
    <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">
    <META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT">
    或者<META HTTP-EQUIV="expires" CONTENT="0">

    19.怎样让表单没有凹凸感?
    <input type=text style="border:1 solid #000000">

    <input type=text style="border-left:none; border-right:none; border-top:none; border-bottom:

    1 solid #000000"></textarea>

    20.<div><span>&<layer>的区别?
    <div>(division)用来定义大段的页面元素,会产生转行
    <span>用来定义同一行内的元素,跟<div>的唯一区别是不产生转行
    <layer>是ns的标记,ie不支持,相当于<div>

    21.让弹出窗口总是在最上面:
    <body οnblur="this.focus();">

    22.不要滚动条?
    让竖条没有:
    <body style="overflow:scroll;overflow-y:hidden">
    </body>
    让横条没有:
    <body style="overflow:scroll;overflow-x:hidden">
    </body>
    两个都去掉?更简单了
    <body scroll="no">
    </body>

    23.怎样去掉图片链接点击后,图片周围的虚线?
    <a href="#" onFocus="this.blur()"><img src="logo.jpg" border=0></a>

    24.电子邮件处理提交表单
    <form name="form1" method="post" action="mailto:****@***.com" enctype="text/plain">
    <input type=submit>
    </form>

    25.在打开的子窗口刷新父窗口的代码里如何写?
    window.opener.location.reload()

    26.如何设定打开页面的大小
    <body οnlοad="top.resizeTo(300,200);">
    打开页面的位置<body οnlοad="top.moveBy(300,200);">

    27.在页面中如何加入不是满铺的背景图片,拉动页面时背景图不动
    <STYLE>
    body
    {background-image:url(logo.gif); background-repeat:no-repeat;
    background-position:center;background-attachment: fixed}
    </STYLE>

    28. 检查一段字符串是否全由数字组成
    <script language="Javascript"><!--
    function checkNum(str){return str.match(//D/)==null}
    alert(checkNum("1232142141"))
    alert(checkNum("123214214a1"))
    // --></script>

    29. 获得一个窗口的大小
    document.body.clientWidth; document.body.clientHeight

    30. 怎么判断是否是字符
    if (/[^/x00-/xff]/g.test(s)) alert("含有汉字");
    else alert("全是字符");

    31.TEXTAREA自适应文字行数的多少
    <textarea rows=1 name=s1 cols=27 onpropertychange="this.style.posHeight=this.scrollHeight">
    </textarea>

    32. 日期减去天数等于第二个日期
    <script language=Javascript>
    function cc(dd,dadd)
    {
    //可以加上错误处理
    var a = new Date(dd)
    a = a.valueOf()
    a = a - dadd * 24 * 60 * 60 * 1000
    a = new Date(a)
    alert(a.getFullYear() + "年" + (a.getMonth() + 1) + "月" + a.getDate() + "日")
    }
    cc("12/23/2002",2)
    </script>

    33. 选择了哪一个Radio
    <HTML><script language="vbscript">
    function checkme()
    for each ob in radio1
    if ob.checked then window.alert ob.value
    next
    end function
    </script><BODY>
    <INPUT name="radio1" type="radio" value="style" checked>Style
    <INPUT name="radio1" type="radio" value="barcode">Barcode
    <INPUT type="button" value="check" οnclick="checkme()">
    </BODY></HTML>

    34.脚本永不出错
    <SCRIPT LANGUAGE="JavaScript">
    <!-- Hide
    function killErrors() {
    return true;
    }
    window.onerror = killErrors;
    // -->
    </SCRIPT>

    35.ENTER键可以让光标移到下一个输入框
    <input οnkeydοwn="if(event.keyCode==13)event.keyCode=9">

    36. 检测某个网站的链接速度:
    把如下代码加入<body>区域中:
    <script language=Javascript>
    tim=1
    setInterval("tim++",100)
    b=1
    var autourl=new Array()
    autourl[1]="www.njcatv.net"
    autourl[2]="javacool.3322.net"
    autourl[3]="www.sina.com.cn"
    autourl[4]="www.nuaa.edu.cn"
    autourl[5]="www.cctv.com"
    function butt(){
    document.write("<form name=autof>")
    for(var i=1;i<autourl.length;i++)
    document.write("<input type=text name=txt"+i+" size=10 value=测试中……> =》<input type=text
    name=url"+i+" size=40> =》<input type=button value=GO

    οnclick=window.open(this.form.url"+i+".value)><br>")
    document.write("<input type=submit value=刷新></form>")
    }
    butt()
    function auto(url){
    document.forms[0]["url"+b].value=url
    if(tim>200)
    {document.forms[0]["txt"+b].value="链接超时"}
    else
    {document.forms[0]["txt"+b].value="时间"+tim/10+"秒"}
    b++
    }
    function run(){for(var i=1;i<autourl.length;i++)document.write("<img src=http://"+autourl+"/"+Math.random()+"

    width=1 height=1

    οnerrοr=auto("http://"+autourl+"")>") }
    run()</script>

    37. 各种样式的光标
    auto :标准光标
    default :标准箭头
    hand :手形光标
    wait :等待光标
    text :I形光标
    vertical-text :水平I形光标
    no-drop :不可拖动光标
    not-allowed :无效光标
    help :?帮助光标
    all-scroll :三角方向标
    move :移动标
    crosshair :十字标
    e-resize
    n-resize
    nw-resize
    w-resize
    s-resize
    se-resize
    sw-resize

    38.页面进入和退出的特效
    进入页面<meta http-equiv="Page-Enter" content="revealTrans(duration=x, transition=y)">
    推出页面<meta http-equiv="Page-Exit" content="revealTrans(duration=x, transition=y)">
    这个是页面被载入和调出时的一些特效。duration表示特效的持续时间,以秒为单位。transition表示使用哪种特效,取值为

    1-23:
      0 矩形缩小
      1 矩形扩大
      2 圆形缩小
      3 圆形扩大
      4 下到上刷新
      5 上到下刷新
      6 左到右刷新
      7 右到左刷新
      8 竖百叶窗
      9 横百叶窗
      10 错位横百叶窗
      11 错位竖百叶窗
      12 点扩散
      13 左右到中间刷新
      14 中间到左右刷新
      15 中间到上下
      16 上下到中间
      17 右下到左上
      18 右上到左下
      19 左上到右下
      20 左下到右上
      21 横条
      22 竖条
      23 以上22种随机选择一种

    39.在规定时间内跳转
    <META http-equiv=V="REFRESH" content="5;URL=http://www.51js.com">

    40.网页是否被检索
    <meta name="ROBOTS" content="属性值">
      其中属性值有以下一些:
      属性值为"all": 文件将被检索,且页上链接可被查询;
      属性值为"none": 文件不被检索,而且不查询页上的链接;
      属性值为"index": 文件将被检索;
      属性值为"follow": 查询页上的链接;
      属性值为"noindex": 文件不检索,但可被查询链接;
      属性值为"nofollow": 文件不被检索,但可查询页上的链接。
    >>>---------我想分页!--这么长的文章,在这里来个分页多好啊!哈哈----------<<<
    js宝典学习笔记ZT

    每一项都是js中的小技巧,但十分的实用!
    1.document.write(""); 输出语句
    2.JS中的注释为//
    3.传统的HTML文档顺序是:document->html->(head,body)
    4.一个浏览器窗口中的DOM顺序是:window->(navigator,screen,history,location,document)
    5.得到表单中元素的名称和值:document.getElementByIdx_x("表单中元素的ID号").name(或value)
    6.一个小写转大写的JS: document.getElementByIdx_x("output").value = document.getElementByIdx_x("input").value.toUpperCase();
    7.JS中的值类型:String,Number,Boolean,Null,Object,Function
    8.JS中的字符型转换成数值型:parseInt(),parseFloat()
    9.JS中的数字转换成字符型:(""+变量)
    10.JS中的取字符串长度是:(length)
    11.JS中的字符与字符相连接使用+号.
    12.JS中的比较操作符有:==等于,!=不等于,>,>=,<.<=
    13.JS中声明变量使用:var来进行声明
    14.JS中的判断语句结构:if(condition){}else{}
    15.JS中的循环结构:for([initial expression];[condition];[upadte expression]) {inside loop}
    16.循环中止的命令是:break
    17.JS中的函数定义:function functionName([parameter],...){statement[s]}
    18.当文件中出现多个form表单时.可以用document.forms[0],document.forms[1]来代替.
    19.窗口:打开窗口window.open(), 关闭一个窗口:window.close(), 窗口本身:self
    20.状态栏的设置:window.status="字符";
    21.弹出提示信息:window.alert("字符");
    22.弹出确认框:window.confirm();
    23.弹出输入提示框:window.prompt();
    24.指定当前显示链接的位置:window.location.href="URL"
    25.取出窗体中的所有表单的数量:document.forms.length
    26.关闭文档的输出流:document.close();
    27.字符串追加连接符:+=
    28.创建一个文档元素:document.createElement_x(),document.createTextNode()
    29.得到元素的方法:document.getElementByIdx_x()
    30.设置表单中所有文本型的成员的值为空:
    var form = window.document.forms[0]
    for (var i = 0; i<form.elements.length;i++){
    if (form.elements[i].type == "text"){
    form.elements[i].value = "";
    }
    }
    31.复选按钮在JS中判断是否选中:document.forms[0].checkThis.checked (checked属性代表为是否选中返回TRUE或FALSE)
    32.单选按钮组(单选按钮的名称必须相同):取单选按钮组的长度document.forms[0].groupName.length
    33.单选按钮组判断是否被选中也是用checked.
    34.下拉列表框的值:document.forms[0].selectName.options[n].value (n有时用下拉列表框名称加上.selectedIndex来确定被选中的值)
    35.字符串的定义:var myString = new String("This is lightsword");
    36.字符串转成大写:string.toUpperCase(); 字符串转成小写:string.toLowerCase();
    37.返回字符串2在字符串1中出现的位置:String1.indexOf("String2")!=-1则说明没找到.
    38.取字符串中指定位置的一个字符:StringA.charAt(9);
    39.取出字符串中指定起点和终点的子字符串:stringA.substring(2,6);
    40.数学函数:Math.PI(返回圆周率),Math.SQRT2(返回开方),Math.max(value1,value2)返回两个数中的最在值,Math.pow(value1,10)返回value1的十次方,Math.round(value1)四舍五入函数,Math.floor(Math.random()*(n+1))返回随机数
    41.定义日期型变量:var today = new Date();
    42.日期函数列表:dateObj.getTime()得到时间,dateObj.getYear()得到年份,dateObj.getFullYear()得到四位的年份,dateObj.getMonth()得到月份,dateObj.getDate()得到日,dateObj.getDay()得到日期几,dateObj.getHours()得到小时,dateObj.getMinutes()得到分,dateObj.getSeconds()得到秒,dateObj.setTime(value)设置时间,dateObj.setYear(val)设置年,dateObj.setMonth(val)设置月,dateObj.setDate(val)设置日,dateObj.setDay(val)设置星期几,dateObj.setHours设置小时,dateObj.setMinutes(val)设置分,dateObj.setSeconds(val)设置秒 [注意:此日期时间从0开始计]
    43.FRAME的表示方式: [window.]frames[n].ObjFuncVarName,frames["frameName"].ObjFuncVarName,frameName.ObjFuncVarName
    44.parent代表父亲对象,top代表最顶端对象
    45.打开子窗口的父窗口为:opener
    46.表示当前所属的位置:this
    47.当在超链接中调用JS函数时用:(javascript :)来开头后面加函数名
    48.在老的浏览器中不执行此JS:<!-- //-->
    49.引用一个文件式的JS:<script type="text/javascript" src="aaa.js"></script>
    50.指定在不支持脚本的浏览器显示的HTML:<noscript></noscript>
    51.当超链和ONCLICK事件都有时,则老版本的浏览器转向a.html,否则转向b.html.例:<a href="a.html" οnclick="location.href='b.html';return false">dfsadf</a>
    52.JS的内建对象有:Array,Boolean,Date,Error,EvalError,Function,Math,Number,Object,RangeError,ReferenceError,RegExp,String,SyntaxError,TypeError,URIError
    53.JS中的换行:/n
    54.窗口全屏大小:<script>function fullScreen(){ this.moveTo(0,0);this.outerWidth=screen.availWidth;this.outerHeight=screen.availHeight;}window.maximize=fullScreen;</script>
    55.JS中的all代表其下层的全部元素
    56.JS中的焦点顺序:document.getElementByIdx_x("表单元素").tabIndex = 1
    57.innerHTML的值是表单元素的值:如<p id="para">"how are <em>you</em>"</p>,则innerHTML的值就是:how are <em>you</em>
    58.innerTEXT的值和上面的一样,只不过不会把<em>这种标记显示出来.
    59.contentEditable可设置元素是否可被修改,isContentEditable返回是否可修改的状态.
    60.isDisabled判断是否为禁止状态.disabled设置禁止状态
    61.length取得长度,返回整型数值
    62.addBehavior()是一种JS调用的外部函数文件其扩展名为.htc
    63.window.focus()使当前的窗口在所有窗口之前.
    64.blur()指失去焦点.与FOCUS()相反.
    65.select()指元素为选中状态.
    66.防止用户对文本框中输入文本:οnfοcus="this.blur()"
    67.取出该元素在页面中出现的数量:document.all.tags("div(或其它HTML标记符)").length
    68.JS中分为两种窗体输出:模态和非模态.window.showModaldialog(),window.showModeless()
    69.状态栏文字的设置:window.status='文字',默认的状态栏文字设置:window.defaultStatus = '文字.';
    70.添加到收藏夹:external.AddFavorite("http://www.dannyg.com" ,"jaskdlf");
    71.JS中遇到脚本错误时不做任何操作:window.onerror = doNothing; 指定错误句柄的语法为:window.onerror = handleError;
    72.JS中指定当前打开窗口的父窗口:window.opener,支持opener.opener...的多重继续.
    73.JS中的self指的是当前的窗口
    74.JS中状态栏显示内容:window.status="内容"
    75.JS中的top指的是框架集中最顶层的框架
    76.JS中关闭当前的窗口:window.close();
    77.JS中提出是否确认的框:if(confirm("Are you sure?")){alert("ok");}else{alert("Not Ok");}
    78.JS中的窗口重定向:window.navigate("http://www.sina.com.cn");
    79.JS中的打印:window.print()
    80.JS中的提示输入框:window.prompt("message","defaultReply");
    81.JS中的窗口滚动条:window.scroll(x,y)
    82.JS中的窗口滚动到位置:window.scrollby
    83.JS中设置时间间隔:setInterval("expr",msecDelay)或setInterval(funcRef,msecDelay)或setTimeout
    84.JS中的模态显示在IE4+行,在NN中不行:showModalDialog("URL"[,arguments][,features]);
    85.JS中的退出之前使用的句柄:function verifyClose(){event.returnValue="we really like you and hope you will stay longer.";}} window.οnbefοreunlοad=verifyClose;
    86.当窗体第一次调用时使用的文件句柄:onload()
    87.当窗体关闭时调用的文件句柄:onunload()
    88.window.location的属性: protocol(http:),hostname(www.example.com),port(80),host(www.example.com:80),pathname("/a/a.html"),hash("#giantGizmo",指跳转到相应的锚记),href(全部的信息)
    89.window.location.reload()刷新当前页面.
    90.window.history.back()返回上一页,window.history.forward()返回下一页,window.history.go(返回第几页,也可以使用访问过的URL)
    91.document.write()不换行的输出,document.writeln()换行输出
    92.document.body.noWrap=true;防止链接文字折行.
    93.变量名.charAt(第几位),取该变量的第几位的字符.
    94."abc".charCodeAt(第几个),返回第几个字符的ASCii码值.
    95.字符串连接:string.concat(string2),或用+=进行连接
    96.变量.indexOf("字符",起始位置),返回第一个出现的位置(从0开始计算)
    97.string.lastIndexOf(searchString[,startIndex])最后一次出现的位置.
    98.string.match(regExpression),判断字符是否匹配.
    99.string.replace(regExpression,replaceString)替换现有字符串.
    100.string.split(分隔符)返回一个数组存储值.
    101.string.substr(start[,length])取从第几位到指定长度的字符串.
    102.string.toLowerCase()使字符串全部变为小写.
    103.string.toUpperCase()使全部字符变为大写.
    104.parseInt(string[,radix(代表进制)])强制转换成整型.
    105.parseFloat(string[,radix])强制转换成浮点型.
    106.isNaN(变量):测试是否为数值型.
    107.定义常量的关键字:const,定义变量的关键字:var
    >>>---------我想分页!--这么长的文章,在这里来个分页多好啊!哈哈----------<<<

     程序代码
    //去左空格;
    function ltrim(s){
    return s.replace( /^/s*/, "");
    }


     程序代码
    //去右空格;
    function rtrim(s){
    return s.replace( //s*$/, "");
    }


     程序代码
    //左右空格;
    function trim(s){
    return rtrim(ltrim(s));
    }


     程序代码
    //替换
    function replace(s, t, u) {
    i = s.indexOf(t);
    r = "";
    if (i == -1) return s;
    r += s.substring(0,i) + u;
    if ( i + t.length < s.length)
    r += replace(s.substring(i + t.length, s.length), t, u);
    return r;
    }


     程序代码
    //检查非法字符
    //str 要检查的字符
    //badwords 非法字符 &|<>=
    function checkbadwords(str, badwords) {
    if (typeof (str) != "string" || typeof (badwords) != "string") {
    return (false);
    }
    for (i=0; i<badwords.length; i++) {
    bad = badwords.charAt(i);
    for (j=0; j<str.length; j++) {
    if (bad == str.charAt(j)) {
    return false;
    break;
    }
    }
    }
    return true;
    }


     程序代码
    //检查合法字符,限制只能输入的字符
    //str 要检查的字符
    //goodwords 合法字符 1234567890abcdefghijklmnopqrstuvwxyz
    function checkgoodwords(str, goodwords) {
    if (typeof (str) != "string" || typeof (goodwords) != "string") {
    return (false);
    }
    for (i=0; i<str.length; i++) {
    this_str = str.charAt(i);
    for (j=0; j<goodwords.length; j++) {
    if (this_str == goodwords.charAt(j)) {
    break;
    }
    if(j==goodwords.length-1){
    return false;
    }
    }
    }
    return true;
    }


     程序代码
    //函 数 名:chkinteger
    //功能介绍:检查是否为数字
    //参数说明:要检查的字符串
    //返 回 值:false:不是 true:是
    function chkinteger(checkStr) {
    var checkOK = "0123456789+-";
    var allValid = true;
    for (i=0; i<checkStr.length; i++) {
    ch = checkStr.charAt(i);
    if (checkOK.indexOf(ch) == -1) {
    allValid = false;
    break;
    }
    if ((ch == '+' || ch == '-') && i>0) {
    allValid = false;
    break;
    }
    }
    return (allValid);
    }


     程序代码
    //函 数 名:chklength
    //功能介绍:检查字符串的长度
    //参数说明:要检查的字符串
    //返 回 值:字节长度值
    function chklength(checkStr) {
    var n = 0;
    for (i=0; i<checkStr.length; i++) {
    chcode = checkStr.charCodeAt(i);
    if (chcode>=0 && chcode<=255) {
    n++;
    } else {
    n += 2;
    }
    }
    return (n);
    }


     程序代码
    //复选框全选和不全选
    //使用方法:
    //<input name="chkAll" type="checkbox" id="chkAll" οnclick=CheckAll(this.form) value="checkbox">
    function unselectall()
    {
    if(document.myform.chkAll.checked){
    document.myform.chkAll.checked = document.myform.chkAll.checked&0;
    }
    }
    function CheckAll(form)
    {
    for (var i=0;i<form.elements.length;i++)
    {
    var e = form.elements[i];
    if (e.Name != "chkAll"&&e.disabled==false)
    e.checked = form.chkAll.checked;
    }
    }


     程序代码
    //check date
    //return: 1,days 2,false
    //2005-12-19 2005-12-29
    function checkdate(start_date,end_date){
    //alert("start_date:["+start_date+"] end_date:["+end_date+"]");
    //isnull
    if(start_date=="" || end_date==""){
    //alert("false");
    return false;
    }
    var strSeparator = "-"; //split symbol
    //is-
    if(start_date.charAt(4)!=strSeparator && start_date.charAt(7)!=strSeparator && end_date.charAt(4)!=strSeparator && end_date.charAt(7)!=strSeparator){
    //alert(start_date.charAt(7));
    return false;
    }
    var strDateArrayStart;
    var strDateArrayEnd;
    strDateArrayStart = start_date.split(strSeparator);
    strDateArrayEnd = end_date.split(strSeparator);
    var strDateS = new Date(strDateArrayStart[0] + "/" + strDateArrayStart[1] + "/" + strDateArrayStart[2]);
    var strDateE = new Date(strDateArrayEnd[0] + "/" + strDateArrayEnd[1] + "/" + strDateArrayEnd[2]);
    //check date
    var intDay;
    intDay = (strDateE-strDateS)/(1000*3600*24);
    //alert(intDay);
    return intDay;
    }


     程序代码
    //checkdate_month
    //return: 1,true 2,false
    //2005-12-19 2005-12-29
    //month: number
    function checkdate_month(start_date,end_date,month){
    //alert("start_date:["+start_date+"] end_date:["+end_date+"]");
    //isnull
    if(start_date=="" || end_date=="" || month==""){
    //alert("false");
    return false;
    }
    var strSeparator = "-"; //split symbol
    //is-
    if(start_date.charAt(4)!=strSeparator && start_date.charAt(7)!=strSeparator && end_date.charAt(4)!=strSeparator && end_date.charAt(7)!=strSeparator){
    //alert(start_date.charAt(7));
    return false;
    }
    var strDateArrayStart;
    var strDateArrayEnd;
    strDateArrayStart = start_date.split(strSeparator);
    strDateArrayEnd = end_date.split(strSeparator);
    var strDateS = new Date(strDateArrayStart[0] + "/" + strDateArrayStart[1] + "/" + strDateArrayStart[2]);
    var strDateE = new Date(strDateArrayEnd[0] + "/" + strDateArrayEnd[1] + "/" + strDateArrayEnd[2]);
    //check date
    var intDay;
    intDay = (strDateE-strDateS)/(1000*3600*24);
    //alert(intDay);
    var intMonth = intDay/30;
    if(intMonth>month){
    return false;
    }
    return true;
    }

    常用正则表达式常用表达式:
    "^d+$"  //非负整数(正整数 + 0)
    "^[0-9]*[1-9][0-9]*$"  //正整数
    "^((-d+)|(0+))$"  //非正整数(负整数 + 0)
    "^-[0-9]*[1-9][0-9]*$"  //负整数
    "^-?d+$"    //整数
    "^d+(.d+)?$"  //非负浮点数(正浮点数 + 0)
    "^(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正浮点数
    "^((-d+(.d+)?)|(0+(.0+)?))$"  //非正浮点数(负浮点数 + 0)
    "^(-(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //负浮点数
    "^(-?d+)(.d+)?$"  //浮点数
    "^[A-Za-z]+$"  //由26个英文字母组成的字符串
    "^[A-Z]+$"  //由26个英文字母的大写组成的字符串
    "^[a-z]+$"  //由26个英文字母的小写组成的字符串
    "^[A-Za-z0-9]+$"  //由数字和26个英文字母组成的字符串
    "^w+$"  //由数字、26个英文字母或者下划线组成的字符串
    "^[w-]+(.[w-]+)*@[w-]+(.[w-]+)+$"    //email地址
    "^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$"  //url
    /^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/   //  年-月-日
    /^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/   // 月/日/年
    "^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$"   //Emil
    "(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?"     //电话号码
    "^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$"   //IP地址

    匹配中文字符的正则表达式: [u4e00-u9fa5]
    匹配双字节字符(包括汉字在内):[^x00-xff]
    匹配空行的正则表达式:n[s| ]*r
    匹配HTML标记的正则表达式:/<(.*)>.*</1>|<(.*) />/
    匹配首尾空格的正则表达式:(^s*)|(s*$)
    匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
    匹配网址URL的正则表达式:^[a-zA-z]+://(/w+(-/w+)*)(/.(/w+(-/w+)*))*(/?/S*)?$
    匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
    匹配国内电话号码:(d{3}-|d{4}-)?(d{8}|d{7})?
    匹配腾讯QQ号:^[1-9]*[1-9][0-9]*$

    匹配中文字符的正则表达式: [u4e00-u9fa5]
    匹配双字节字符(包括汉字在内):[^x00-xff]
    匹配空行的正则表达式:n[s| ]*r
    匹配HTML标记的正则表达式:/<(.*)>.*</1>|<(.*) />/
    匹配首尾空格的正则表达式:(^s*)|(s*$)
    匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
    匹配网址URL的正则表达式:http://([w-]+.)+[w-]+(/[w- ./?%&=]*)?

    利用正则表达式限制网页表单里的文本框输入内容:
    用正则表达式限制只能输入中文:οnkeyup="value=value.replace(/[^u4E00-u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^u4E00-u9FA5]/g,''))"
    用正则表达式限制只能输入全角字符: οnkeyup="value=value.replace(/[^uFF00-uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^uFF00-uFFFF]/g,''))"
    用正则表达式限制只能输入数字:οnkeyup="value=value.replace(/[^d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))"
    用正则表达式限制只能输入数字和英文:οnkeyup="value=value.replace(//g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))"

     

     

    展开全文
  • C# 时间字符串格式化方法

    千次阅读 2018-01-18 17:21:00
    之前忘记是从找到的代码... /// 格式化字符串 /// /// 日期字符串 /// /// d 月中的某一天。一位数的日期没有前导零。 /// dd 月中的某一天。一位数的日期有一个前导零。 /// ddd 周中某天的缩写名称,在 Ab

    之前忘记是从哪找到的代码了,用起来还不错。放在博客上以备后用。

    /// <summary>
            /// 格式化字符串
            /// </summary>
            /// <param name="date">日期字符串</param>
            /// <param name="formatstr">
            /// d 月中的某一天。一位数的日期没有前导零。
            /// dd 月中的某一天。一位数的日期有一个前导零。
            /// ddd 周中某天的缩写名称,在 AbbreviatedDayNames 中定义。
            ///dddd 周中某天的完整名称,在 DayNames 中定义。
            ///M 月份数字。一位数的月份没有前导零。
            ///MM 月份数字。一位数的月份有一个前导零。
            ///MMM 月份的缩写名称,在 AbbreviatedMonthNames 中定义。
            ///MMMM 月份的完整名称,在 MonthNames 中定义。
            ///y 不包含纪元的年份。如果不包含纪元的年份小于 10,则显示不具有前导零的年份。
            ///yy 不包含纪元的年份。如果不包含纪元的年份小于 10,则显示具有前导零的年份。
            ///yyyy 包括纪元的四位数的年份。
            ///gg 时期或纪元。如果要设置格式的日期不具有关联的时期或纪元字符串,则忽略该模式。
            ///h 12 小时制的小时。一位数的小时数没有前导零。
            ///hh 12 小时制的小时。一位数的小时数有前导零。
            ///H 24 小时制的小时。一位数的小时数没有前导零。
            ///HH 24 小时制的小时。一位数的小时数有前导零。
            ///m 分钟。一位数的分钟数没有前导零。
            ///mm 分钟。一位数的分钟数有一个前导零。
            ///s 秒。一位数的秒数没有前导零。
            ///ss 秒。一位数的秒数有一个前导零。
            ///f 秒的小数精度为一位。其余数字被截断。
            ///ff 秒的小数精度为两位。其余数字被截断。
            ///fff 秒的小数精度为三位。其余数字被截断。
            ///ffff 秒的小数精度为四位。其余数字被截断。
            ///fffff 秒的小数精度为五位。其余数字被截断。
            ///ffffff 秒的小数精度为六位。其余数字被截断。
            ///fffffff 秒的小数精度为七位。其余数字被截断。
            ///t 在 AMDesignator 或 PMDesignator 中定义的 AM/PM 指示项的第一个字符(如果存在)。
            ///tt 在 AMDesignator 或 PMDesignator 中定义的 AM/PM 指示项(如果存在)。
            ///z 时区偏移量(“+”或“-”后面仅跟小时)。一位数的小时数没有前导零。例如,太平洋标准时间是“-8”。
            ///zz 时区偏移量(“+”或“-”后面仅跟小时)。一位数的小时数有前导零。例如,太平洋标准时间是“-08”。
            ///zzz 完整时区偏移量(“+”或“-”后面跟有小时和分钟)。一位数的小时数和分钟数有前导零。例如,太平洋标准时间是“-08:00”。
            /// 在 TimeSeparator 中定义的默认时间分隔符。
            /// 在 DateSeparator 中定义的默认日期分隔符。
            ///% c 其中 c 是格式模式(如果单独使用)。如果格式模式与原义字符或其他格式模式合并,则可以省略“%”字符。
            ///\ c 其中 c 是任意字符。照原义显示字符。若要显示反斜杠字符,请使用“\\”。
            ///只有上面第二个表中列出的格式模式才能用于创建自定义模式;在第一个表中列出的标准格式字符不能用于创建自定义模式。自定义模式的长度至少为两个字符;例如,
    
            ///DateTime.ToString( "d") 返回 DateTime 值;“d”是标准短日期模式。
            ///DateTime.ToString( "%d") 返回月中的某天;“%d”是自定义模式。
            ///DateTime.ToString( "d ") 返回后面跟有一个空白字符的月中的某天;“d”是自定义模式。
            /// </param>
            /// <returns>格式化后的数字</returns>
            public static string Ftdatetime(DateTime date, string formatstr)
            {
                return date.ToString(formatstr, DateTimeFormatInfo.InvariantInfo);
            }

    知行办公,专业移动办公平台
     https://zx.naton.cn/
    【总监】十二春秋之,3483099@qq.com;
    【Master】zelo,616701261@qq.com;
    【运营】运维艄公,897221533@qq.com;
    【产品设计】流浪猫,364994559@qq.com;
    【体验设计】兜兜,2435632247@qq.com;
    【iOS】淘码小工,492395860@qq.com;iMcG33K,imcg33k@gmail.com;
    【Android】人猿居士,1059604515@qq.com;思路的顿悟,1217022114@qq.com;
    【java】首席工程师MR_W,feixue300@qq.com;
    【测试】土镜问道,847071279@qq.com;
    【数据】fox009521,42151960@qq.com;
    【安全】保密,你懂的




    展开全文
  • 文本处理

    千次阅读 2020-10-23 09:12:16
    在下一章中, 我们将查看更多的文本处理程序,但主要集中于文本格式化输出程序和其它一些人们需要的工具。 这一章会重新拜访一些老朋友,并且会给我们介绍一些新朋友: cat – 连接文件并且打印到标准输出 sort ...

    所有类 Unix 的操作系统都非常依赖于被用于几种数据类型存储的文本文件。所以这很有道理, 有许多用于处理文本的工具。在这一章中,我们将看一些被用来“切割”文本的程序。在下一章中, 我们将查看更多的文本处理程序,但主要集中于文本格式化输出程序和其它一些人们需要的工具。

    这一章会重新拜访一些老朋友,并且会给我们介绍一些新朋友:

    • cat – 连接文件并且打印到标准输出
    • sort – 给文本行排序
    • uniq – 报告或者省略重复行
    • cut – 从每行中删除文本区域
    • paste – 合并文件文本行
    • join – 基于某个共享字段来联合两个文件的文本行
    • comm – 逐行比较两个有序的文件
    • diff – 逐行比较文件
    • patch – 给原始文件打补丁
    • tr – 翻译或删除字符
    • sed – 用于筛选和转换文本的流编辑器
    • aspell – 交互式拼写检查器

    文本应用程序

    到目前为止,我们已经知道了一对文本编辑器(nano 和 vim),看过一堆配置文件,并且目睹了 许多命令的输出都是文本格式。但是文本还被用来做什么? 它可以做很多事情。

    文档

    许多人使用纯文本格式来编写文档。虽然很容易看到一个小的文本文件对于保存简单的笔记会 很有帮助,但是也有可能用文本格式来编写大的文档。一个流行的方法是先用文本格式来编写一个 大的文档,然后使用一种标记语言来描述已完成文档的格式。许多科学论文就是用这种方法编写的, 因为基于 Unix 的文本处理系统位于支持技术学科作家所需要的高级排版布局的一流系统之列。

    网页

    世界上最流行的电子文档类型可能就是网页了。网页是文本文档,它们使用 HTML(超文本标记语言)或者是 XML (可扩展的标记语言)作为标记语言来描述文档的可视格式。

    电子邮件

    从本质上来说,email 是一个基于文本的媒介。为了传输,甚至非文本的附件也被转换成文本表示形式。 我们能看到这些,通过下载一个 email 信息,然后用 less 来浏览它。我们将会看到这条信息开始于一个标题, 其描述了信息的来源以及在传输过程中它接受到的处理,然后是信息的正文内容。

    打印输出

    在类 Unix 的系统中,输出会以纯文本格式发送到打印机,或者如果页面包含图形,其会被转换成 一种文本格式的页面描述语言,以 PostScript 著称,然后再被发送给一款能产生图形点阵的程序, 最后被打印出来。

    程序源码

    在类 Unix 系统中会发现许多命令行程序被用来支持系统管理和软件开发,并且文本处理程序也不例外。 许多文本处理程序被设计用来解决软件开发问题。文本处理对于软件开发者来言至关重要是因为所有的软件 都起始于文本格式。源代码,程序员实际编写的一部分程序,总是文本格式。

    回顾一些老朋友

    回到第7章(重定向),我们已经知道一些命令除了接受命令行参数之外,还能够接受标准输入。 那时候我们只是简单地介绍了它们,但是现在我们将仔细地看一下它们是怎样被用来执行文本处理的。

    cat

    这个 cat 程序具有许多有趣的选项。其中许多选项用来帮助更好的可视化文本内容。一个例子是-A 选项, 其用来在文本中显示非打印字符。有些时候我们想知道是否控制字符嵌入到了我们的可见文本中。 最常用的控制字符是 tab 字符(而不是空格)和回车字符,在 MS-DOS 风格的文本文件中回车符经常作为 结束符出现。另一种常见情况是文件中包含末尾带有空格的文本行。

    让我们创建一个测试文件,用 cat 程序作为一个简单的文字处理器。为此,我们将键入 cat 命令(随后指定了 用于重定向输出的文件),然后输入我们的文本,最后按下 Enter 键来结束这一行,然后按下组合键 Ctrl-d, 来指示 cat 程序,我们已经到达文件末尾了。在这个例子中,我们文本行的开头和末尾分别键入了一个 tab 字符以及一些空格。

    [me@linuxbox ~]$ cat > foo.txt
        The quick brown fox jumped over the lazy dog.
    [me@linuxbox ~]$
    

    下一步,我们将使用带有-A 选项的 cat 命令来显示这个文本:

    [me@linuxbox ~]$ cat -A foo.txt
    ^IThe quick brown fox jumped over the lazy dog.       $
    [me@linuxbox ~]$
    

    在输出结果中我们看到,这个 tab 字符在我们的文本中由^I 字符来表示。这是一种常见的表示方法,意思是 “Control-I”,结果证明,它和 tab 字符是一样的。我们也看到一个$字符出现在文本行真正的结尾处, 表明我们的文本包含末尾的空格。

    MS-DOS 文本 Vs. Unix 文本

    可能你想用 cat 程序在文本中查看非打印字符的一个原因是发现隐藏的回车符。那么 隐藏的回车符来自于哪里呢?它们来自于 DOS 和 Windows!Unix 和 DOS 在文本文件中定义每行 结束的方式不相同。Unix 通过一个换行符(ASCII 10)来结束一行,然而 MS-DOS 和它的 衍生品使用回车(ASCII 13)和换行字符序列来终止每个文本行。

    有几种方法能够把文件从 DOS 格式转变为 Unix 格式。在许多 Linux 系统中,有两个 程序叫做 dos2unix 和 unix2dos,它们能在两种格式之间转变文本文件。然而,如果你 的系统中没有安装 dos2unix 程序,也不要担心。文件从 DOS 格式转变为 Unix 格式的过程非常 简单;它只简单地涉及到删除违规的回车符。通过随后本章中讨论的一些程序,这个工作很容易 完成。

    cat 程序也包含用来修改文本的选项。最著名的两个选项是-n,其给文本行添加行号和-s, 禁止输出多个空白行。我们这样来说明:

    [me@linuxbox ~]$ cat > foo.txt
    The quick brown fox
    
    jumped over the lazy dog.
    [me@linuxbox ~]$ cat -ns foo.txt
    1   The quick brown fox
    2
    3   jumped over the lazy dog.
    [me@linuxbox ~]$
    

    在这个例子里,我们创建了一个测试文件 foo.txt 的新版本,其包含两行文本,由两个空白行分开。 经由带有-ns 选项的 cat 程序处理之后,多余的空白行被删除,并且对保留的文本行进行编号。 然而这并不是多个进程在操作这个文本,只有一个进程。

    sort

    这个 sort 程序对标准输入的内容,或命令行中指定的一个或多个文件进行排序,然后把排序 结果发送到标准输出。使用与 cat 命令相同的技巧,我们能够演示如何用 sort 程序来处理标准输入:

    [me@linuxbox ~]$ sort > foo.txt
    c
    b
    a
    [me@linuxbox ~]$ cat foo.txt
    a
    b
    c
    

    输入命令之后,我们键入字母“c”,“b”,和“a”,然后再按下 Ctrl-d 组合键来表示文件的结尾。 随后我们查看生成的文件,看到文本行有序地显示。

    因为 sort 程序能接受命令行中的多个文件作为参数,所以有可能把多个文件合并成一个有序的文件。例如, 如果我们有三个文本文件,想要把它们合并为一个有序的文件,我们可以这样做:

    sort file1.txt file2.txt file3.txt > final_sorted_list.txt
    

    sort 程序有几个有趣的选项。这里只是一部分列表:

    表21-1: 常见的 sort 程序选项

    选项长选项描述
    -b--ignore-leading-blanks默认情况下,对整行进行排序,从每行的第一个字符开始。这个选项导致 sort 程序忽略 每行开头的空格,从第一个非空白字符开始排序。
    -f--ignore-case让排序不区分大小写。
    -n--numeric-sort基于字符串的长度来排序。使用此选项允许根据数字值执行排序,而不是字母值。
    -r--reverse按相反顺序排序。结果按照降序排列,而不是升序。
    -k--key=field1[,field2]对从 field1到 field2之间的字符排序,而不是整个文本行。看下面的讨论。
    -m--merge把每个参数看作是一个预先排好序的文件。把多个文件合并成一个排好序的文件,而没有执行额外的排序。
    -o--output=file把排好序的输出结果发送到文件,而不是标准输出。
    -t--field-separator=char定义域分隔字符。默认情况下,域由空格或制表符分隔。

    虽然以上大多数选项的含义是不言自喻的,但是有些也不是。首先,让我们看一下 -n 选项,被用做数值排序。 通过这个选项,有可能基于数值进行排序。我们通过对 du 命令的输出结果排序来说明这个选项,du 命令可以 确定最大的磁盘空间用户。通常,这个 du 命令列出的输出结果按照路径名来排序:

    [me@linuxbox ~]$ du -s /usr/share/\* | head
    252     /usr/share/aclocal
    96      /usr/share/acpi-support
    8       /usr/share/adduser
    196     /usr/share/alacarte
    344     /usr/share/alsa
    8       /usr/share/alsa-base
    12488   /usr/share/anthy
    8       /usr/share/apmd
    21440   /usr/share/app-install
    48      /usr/share/application-registry
    

    在这个例子里面,我们把结果管道到 head 命令,把输出结果限制为前 10 行。我们能够产生一个按数值排序的 列表,来显示 10 个最大的空间消费者:

    [me@linuxbox ~]$ du -s /usr/share/* | sort -nr | head
    509940         /usr/share/locale-langpack
    242660         /usr/share/doc
    197560         /usr/share/fonts
    179144         /usr/share/gnome
    146764         /usr/share/myspell
    144304         /usr/share/gimp
    135880         /usr/share/dict
    76508          /usr/share/icons
    68072          /usr/share/apps
    62844          /usr/share/foomatic
    

    通过使用此 -nr 选项,我们产生了一个反向的数值排序,最大数值排列在第一位。这种排序起作用是 因为数值出现在每行的开头。但是如果我们想要基于文件行中的某个数值排序,又会怎样呢? 例如,命令 ls -l 的输出结果:

    [me@linuxbox ~]$ ls -l /usr/bin | head
    total 152948
    -rwxr-xr-x 1 root   root     34824  2008-04-04  02:42 [
    -rwxr-xr-x 1 root   root    101556  2007-11-27  06:08 a2p
    ...
    

    此刻,忽略 ls 程序能按照文件大小对输出结果进行排序,我们也能够使用 sort 程序来完成此任务:

    [me@linuxbox ~]$ ls -l /usr/bin | sort -nr -k 5 | head
    -rwxr-xr-x 1 root   root   8234216  2008-04-0717:42 inkscape
    -rwxr-xr-x 1 root   root   8222692  2008-04-07 17:42 inkview
    ...
    

    sort 程序的许多用法都涉及到处理表格数据,例如上面 ls 命令的输出结果。如果我们 把数据库这个术语应用到上面的表格中,我们会说每行是一条记录,并且每条记录由多个字段组成, 例如文件属性,链接数,文件名,文件大小等等。sort 程序能够处理独立的字段。在数据库术语中, 我们能够指定一个或者多个关键字段,来作为排序的关键值。在上面的例子中,我们指定 n 和 r 选项来执行相反的数值排序,并且指定 -k 5,让 sort 程序使用第五字段作为排序的关键值。

    这个 k 选项非常有趣,而且还有很多特点,但是首先我们需要讲讲 sort 程序怎样来定义字段。 让我们考虑一个非常简单的文本文件,只有一行包含作者名字的文本。

    William      Shotts
    

    默认情况下,sort 程序把此行看作有两个字段。第一个字段包含字符:

    和第二个字段包含字符:

    意味着空白字符(空格和制表符)被当作是字段间的界定符,当执行排序时,界定符会被 包含在字段当中。再看一下 ls 命令的输出,我们看到每行包含八个字段,并且第五个字段是文件大小:

    -rwxr-xr-x 1 root root 8234216 2008-04-07 17:42 inkscape
    

    让我们考虑用下面的文件,其包含从 2006 年到 2008 年三款流行的 Linux 发行版的发行历史,来做一系列实验。 文件中的每一行都有三个字段:发行版的名称,版本号,和 MM/DD/YYYY 格式的发行日期:

    SUSE        10.2   12/07/2006
    Fedora          10     11/25/2008
    SUSE            11.04  06/19/2008
    Ubuntu          8.04   04/24/2008
    Fedora          8      11/08/2007
    SUSE            10.3   10/04/2007
    ...
    

    使用一个文本编辑器(可能是 vim),我们将输入这些数据,并把产生的文件命名为 distros.txt。

    下一步,我们将试着对这个文件进行排序,并观察输出结果:

    [me@linuxbox ~]$ sort distros.txt
    Fedora          10     11/25/2008
    Fedora          5     03/20/2006
    Fedora          6     10/24/2006
    Fedora          7     05/31/2007
    Fedora          8     11/08/2007
    ...
    

    恩,大部分正确。问题出现在 Fedora 的版本号上。因为在字符集中 “1” 出现在 “5” 之前,版本号 “10” 在 最顶端,然而版本号 “9” 却掉到底端。

    为了解决这个问题,我们必须依赖多个键值来排序。我们想要对第一个字段执行字母排序,然后对 第三个字段执行数值排序。sort 程序允许多个 -k 选项的实例,所以可以指定多个排序关键值。事实上, 一个关键值可能包括一个字段区域。如果没有指定区域(如同之前的例子),sort 程序会使用一个键值, 其始于指定的字段,一直扩展到行尾。下面是多键值排序的语法:

    [me@linuxbox ~]$ sort --key=1,1 --key=2n distros.txt
    Fedora         5     03/20/2006
    Fedora         6     10/24/2006
    Fedora         7     05/31/2007
    ...
    

    虽然为了清晰,我们使用了选项的长格式,但是 -k 1,1 -k 2n 格式是等价的。在第一个 key 选项的实例中, 我们指定了一个字段区域。因为我们只想对第一个字段排序,我们指定了 1,1, 意味着“始于并且结束于第一个字段。”在第二个实例中,我们指定了 2n,意味着第二个字段是排序的键值, 并且按照数值排序。一个选项字母可能被包含在一个键值说明符的末尾,其用来指定排序的种类。这些 选项字母和 sort 程序的全局选项一样:b(忽略开头的空格),n(数值排序),r(逆向排序),等等。

    我们列表中第三个字段包含的日期格式不利于排序。在计算机中,日期通常设置为 YYYY-MM-DD 格式, 这样使按时间顺序排序变得容易,但是我们的日期为美国格式 MM/DD/YYYY。那么我们怎样能按照 时间顺序来排列这个列表呢?

    幸运地是,sort 程序提供了一种方式。这个 key 选项允许在字段中指定偏移量,所以我们能在字段中 定义键值。

    [me@linuxbox ~]$ sort -k 3.7nbr -k 3.1nbr -k 3.4nbr distros.txt
    Fedora         10    11/25/2008
    Ubuntu         8.10  10/30/2008
    SUSE           11.0  06/19/2008
    ...
    

    通过指定 -k 3.7,我们指示 sort 程序使用一个排序键值,其始于第三个字段中的第七个字符,对应于 年的开头。同样地,我们指定 -k 3.1和 -k 3.4来分离日期中的月和日。 我们也添加了 n 和 r 选项来实现一个逆向的数值排序。这个 b 选项用来删除日期字段中开头的空格( 行与行之间的空格数迥异,因此会影响 sort 程序的输出结果)。

    一些文件不会使用 tabs 和空格做为字段界定符;例如,这个 /etc/passwd 文件:

    [me@linuxbox ~]$ head /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    daemon:x:1:1:daemon:/usr/sbin:/bin/sh
    bin:x:2:2:bin:/bin:/bin/sh
    sys:x:3:3:sys:/dev:/bin/sh
    sync:x:4:65534:sync:/bin:/bin/sync
    games:x:5:60:games:/usr/games:/bin/sh
    man:x:6:12:man:/var/cache/man:/bin/sh
    lp:x:7:7:lp:/var/spool/lpd:/bin/sh
    mail:x:8:8:mail:/var/mail:/bin/sh
    news:x:9:9:news:/var/spool/news:/bin/sh
    

    这个文件的字段之间通过冒号分隔开,所以我们怎样使用一个 key 字段来排序这个文件?sort 程序提供 了一个 -t 选项来定义分隔符。按照第七个字段(帐户的默认 shell)来排序此 passwd 文件,我们可以这样做:

    [me@linuxbox ~]$ sort -t ':' -k 7 /etc/passwd | head
    me:x:1001:1001:Myself,,,:/home/me:/bin/bash
    root:x:0:0:root:/root:/bin/bash
    dhcp:x:101:102::/nonexistent:/bin/false
    gdm:x:106:114:Gnome Display Manager:/var/lib/gdm:/bin/false
    hplip:x:104:7:HPLIP system user,,,:/var/run/hplip:/bin/false
    klog:x:103:104::/home/klog:/bin/false
    messagebus:x:108:119::/var/run/dbus:/bin/false
    polkituser:x:110:122:PolicyKit,,,:/var/run/PolicyKit:/bin/false
    pulse:x:107:116:PulseAudio daemon,,,:/var/run/pulse:/bin/false
    

    通过指定冒号字符做为字段分隔符,我们能按照第七个字段来排序。

    uniq

    与 sort 程序相比,这个 uniq 程序是个轻量级程序。uniq 执行一个看似琐碎的认为。当给定一个 排好序的文件(包括标准输出),uniq 会删除任意重复行,并且把结果发送到标准输出。 它常常和 sort 程序一块使用,来清理重复的输出。


    uniq 程序是一个传统的 Unix 工具,经常与 sort 程序一块使用,但是这个 GNU 版本的 sort 程序支持一个 -u 选项,其可以从排好序的输出结果中删除重复行。


    让我们创建一个文本文件,来实验一下:

    [me@linuxbox ~]$ cat > foo.txt
    a
    b
    c
    a
    b
    c
    

    记住输入 Ctrl-d 来终止标准输入。现在,如果我们对文本文件执行 uniq 命令:

    [me@linuxbox ~]$ uniq foo.txt
    a
    b
    c
    a
    b
    c
    

    输出结果与原始文件没有差异;重复行没有被删除。实际上,uniq 程序能完成任务,其输入必须是排好序的数据,

    [me@linuxbox ~]$ sort foo.txt | uniq
    a
    b
    c
    

    这是因为 uniq 只会删除相邻的重复行。uniq 程序有几个选项。这里是一些常用选项:

    表21-2: 常用的 uniq 选项

    选项说明
    -c输出所有的重复行,并且每行开头显示重复的次数。
    -d只输出重复行,而不是特有的文本行。
    -f n忽略每行开头的 n 个字段,字段之间由空格分隔,正如 sort 程序中的空格分隔符;然而, 不同于 sort 程序,uniq 没有选项来设置备用的字段分隔符。
    -i在比较文本行的时候忽略大小写。
    -s n跳过(忽略)每行开头的 n 个字符。
    -u只是输出独有的文本行。这是默认的。

    这里我们看到 uniq 被用来报告文本文件中重复行的次数,使用这个-c 选项:

    [me@linuxbox ~]$ sort foo.txt | uniq -c
            2 a
            2 b
            2 c
    

    切片和切块

    下面我们将要讨论的三个程序用来从文件中获得文本列,并且以有用的方式重组它们。

    cut

    这个 cut 程序被用来从文本行中抽取文本,并把其输出到标准输出。它能够接受多个文件参数或者 标准输入。

    从文本行中指定要抽取的文本有些麻烦,使用以下选项:

    表21-3: cut 程序选择项

    选项说明
    -c char_list从文本行中抽取由 char_list 定义的文本。这个列表可能由一个或多个逗号 分隔开的数值区间组成。
    -f field_list从文本行中抽取一个或多个由 field_list 定义的字段。这个列表可能 包括一个或多个字段,或由逗号分隔开的字段区间。
    -d delim_char当指定-f 选项之后,使用 delim_char 做为字段分隔符。默认情况下, 字段之间必须由单个 tab 字符分隔开。
    --complement抽取整个文本行,除了那些由-c 和/或-f 选项指定的文本。

    正如我们所看到的,cut 程序抽取文本的方式相当不灵活。cut 命令最好用来从其它程序产生的文件中 抽取文本,而不是从人们直接输入的文本中抽取。我们将会看一下我们的 distros.txt 文件,看看 是否它足够 “整齐” 成为 cut 实例的一个好样本。如果我们使用带有 -A 选项的 cat 命令,我们能查看是否这个 文件符号由 tab 字符分离字段的要求。

    [me@linuxbox ~]$ cat -A distros.txt
    SUSE^I10.2^I12/07/2006$
    Fedora^I10^I11/25/2008$
    SUSE^I11.0^I06/19/2008$
    Ubuntu^I8.04^I04/24/2008$
    Fedora^I8^I11/08/2007$
    SUSE^I10.3^I10/04/2007$
    Ubuntu^I6.10^I10/26/2006$
    Fedora^I7^I05/31/2007$
    Ubuntu^I7.10^I10/18/2007$
    Ubuntu^I7.04^I04/19/2007$
    SUSE^I10.1^I05/11/2006$
    Fedora^I6^I10/24/2006$
    Fedora^I9^I05/13/2008$
    Ubuntu^I6.06^I06/01/2006$
    Ubuntu^I8.10^I10/30/2008$
    Fedora^I5^I03/20/2006$
    

    看起来不错。字段之间仅仅是单个 tab 字符,没有嵌入空格。因为这个文件使用了 tab 而不是空格, 我们将使用 -f 选项来抽取一个字段:

    [me@linuxbox ~]$ cut -f 3 distros.txt
    12/07/2006
    11/25/2008
    06/19/2008
    04/24/2008
    11/08/2007
    10/04/2007
    10/26/2006
    05/31/2007
    10/18/2007
    04/19/2007
    05/11/2006
    10/24/2006
    05/13/2008
    06/01/2006
    10/30/2008
    03/20/2006
    

    因为我们的 distros 文件是由 tab 分隔开的,最好用 cut 来抽取字段而不是字符。这是因为一个由 tab 分离的文件, 每行不太可能包含相同的字符数,这就使计算每行中字符的位置变得困难或者是不可能。在以上事例中,然而, 我们已经抽取了一个字段,幸运地是其包含地日期长度相同,所以通过从每行中抽取年份,我们能展示怎样 来抽取字符:

    [me@linuxbox ~]$ cut -f 3 distros.txt | cut -c 7-10
    2006
    2008
    2007
    2006
    2007
    2006
    2008
    2006
    2008
    2006
    

    通过对我们的列表再次运行 cut 命令,我们能够抽取从位置7到10的字符,其对应于日期字段的年份。 这个 7-10 表示法是一个区间的例子。cut 命令手册包含了一个如何指定区间的完整描述。

    展开 Tabs

    distros.txt 的文件格式很适合使用 cut 程序来抽取字段。但是如果我们想要 cut 程序 按照字符,而不是字段来操作一个文件,那又怎样呢?这要求我们用相应数目的空格来 代替 tab 字符。幸运地是,GNU 的 Coreutils 软件包有一个工具来解决这个问题。这个 程序名为 expand,它既可以接受一个或多个文件参数,也可以接受标准输入,并且把 修改过的文本送到标准输出。

    如果我们通过 expand 来处理 distros.txt 文件,我们能够使用 cut -c 命令来从文件中抽取 任意区间内的字符。例如,我们能够使用以下命令来从列表中抽取发行年份,通过展开 此文件,再使用 cut 命令,来抽取从位置 23 开始到行尾的每一个字符:

    [me@linuxbox ~]$ expand distros.txt | cut -c 23-

    Coreutils 软件包也提供了 unexpand 程序,用 tab 来代替空格。

    当操作字段的时候,有可能指定不同的字段分隔符,而不是 tab 字符。这里我们将会从/etc/passwd 文件中 抽取第一个字段:

    [me@linuxbox ~]$ cut -d ':' -f 1 /etc/passwd | head
    root
    daemon
    bin
    sys
    sync
    games
    man
    lp
    mail
    news
    

    使用-d 选项,我们能够指定冒号做为字段分隔符。

    paste

    这个 paste 命令的功能正好与 cut 相反。它会添加一个或多个文本列到文件中,而不是从文件中抽取文本列。 它通过读取多个文件,然后把每个文件中的字段整合成单个文本流,输入到标准输出。类似于 cut 命令, paste 接受多个文件参数和 / 或标准输入。为了说明 paste 是怎样工作的,我们将会对 distros.txt 文件 动手术,来产生发行版的年代表。

    从我们之前使用 sort 的工作中,首先我们将产生一个按照日期排序的发行版列表,并把结果 存储在一个叫做 distros-by-date.txt 的文件中:

    [me@linuxbox ~]$ sort -k 3.7nbr -k 3.1nbr -k 3.4nbr distros.txt > distros-by-date.txt
    

    下一步,我们将会使用 cut 命令从文件中抽取前两个字段(发行版名字和版本号),并把结果存储到 一个名为 distro-versions.txt 的文件中:

    [me@linuxbox ~]$ cut -f 1,2 distros-by-date.txt > distros-versions.txt
    [me@linuxbox ~]$ head distros-versions.txt
    Fedora     10
    Ubuntu     8.10
    SUSE       11.0
    Fedora     9
    Ubuntu     8.04
    Fedora     8
    Ubuntu     7.10
    SUSE       10.3
    Fedora     7
    Ubuntu     7.04
    

    最后的准备步骤是抽取发行日期,并把它们存储到一个名为 distro-dates.txt 文件中:

    [me@linuxbox ~]$ cut -f 3 distros-by-date.txt > distros-dates.txt
    [me@linuxbox ~]$ head distros-dates.txt
    11/25/2008
    10/30/2008
    06/19/2008
    05/13/2008
    04/24/2008
    11/08/2007
    10/18/2007
    10/04/2007
    05/31/2007
    04/19/2007
    

    现在我们拥有了我们所需要的文本了。为了完成这个过程,使用 paste 命令来把日期列放到发行版名字 和版本号的前面,这样就创建了一个年代列表。通过使用 paste 命令,然后按照期望的顺序来安排它的 参数,就能很容易完成这个任务。

    [me@linuxbox ~]$ paste distros-dates.txt distros-versions.txt
    11/25/2008	Fedora     10
    10/30/2008	Ubuntu     8.10
    06/19/2008	SUSE       11.0
    05/13/2008	Fedora     9
    04/24/2008	Ubuntu     8.04
    11/08/2007	Fedora     8
    10/18/2007	Ubuntu     7.10
    10/04/2007	SUSE       10.3
    05/31/2007	Fedora     7
    04/19/2007	Ubuntu     7.04
    

    join

    在某些方面,join 命令类似于 paste,它会往文件中添加列,但是它使用了独特的方法来完成。 一个 join 操作通常与关系型数据库有关联,在关系型数据库中来自多个享有共同关键域的表格的 数据结合起来,得到一个期望的结果。这个 join 程序执行相同的操作。它把来自于多个基于共享 关键域的文件的数据结合起来。

    为了知道在关系数据库中是怎样使用 join 操作的,让我们想象一个很小的数据库,这个数据库由两个 表格组成,每个表格包含一条记录。第一个表格,叫做 CUSTOMERS,有三个数据域:一个客户号(CUSTNUM), 客户的名字(FNAME)和客户的姓(LNAME):

    CUSTNUM	    FNAME       ME
    ========    =====       ======
    4681934	    John        Smith
    

    第二个表格叫做 ORDERS,其包含四个数据域:订单号(ORDERNUM),客户号(CUSTNUM),数量(QUAN), 和订购的货品(ITEM)。

    ORDERNUM        CUSTNUM     QUAN ITEM
    ========        =======     ==== ====
    3014953305      4681934     1    Blue Widget
    

    注意两个表格共享数据域 CUSTNUM。这很重要,因为它使表格之间建立了联系。

    执行一个 join 操作将允许我们把两个表格中的数据域结合起来,得到一个有用的结果,例如准备 一张发货单。通过使用两个表格 CUSTNUM 数字域中匹配的数值,一个 join 操作会产生以下结果:

    FNAME       LNAME       QUAN ITEM
    =====       =====       ==== ====
    John        Smith       1    Blue Widget
    

    为了说明 join 程序,我们需要创建一对包含共享键值的文件。为此,我们将使用我们的 distros.txt 文件。 从这个文件中,我们将构建额外两个文件,一个包含发行日期(其会成为共享键值)和发行版名称:

    [me@linuxbox ~]$ cut -f 1,1 distros-by-date.txt > distros-names.txt
    [me@linuxbox ~]$ paste distros-dates.txt distros-names.txt > distros-key-names.txt
    [me@linuxbox ~]$ head distros-key-names.txt
    11/25/2008 Fedora
    10/30/2008 Ubuntu
    06/19/2008 SUSE
    05/13/2008 Fedora
    04/24/2008 Ubuntu
    11/08/2007 Fedora
    10/18/2007 Ubuntu
    10/04/2007 SUSE
    05/31/2007 Fedora
    04/19/2007 Ubuntu
    

    第二个文件包含发行日期和版本号:

    [me@linuxbox ~]$ cut -f 2,2 distros-by-date.txt > distros-vernums.txt
    [me@linuxbox ~]$ paste distros-dates.txt distros-vernums.txt > distros-key-vernums.txt
    [me@linuxbox ~]$ head distros-key-vernums.txt
    11/25/2008 10
    10/30/2008 8.10
    06/19/2008 11.0
    05/13/2008 9
    04/24/2008 8.04
    11/08/2007 8
    10/18/2007 7.10
    10/04/2007 10.3
    05/31/2007 7
    04/19/2007 7.04
    

    现在我们有两个具有共享键值( “发行日期” 数据域 )的文件。有必要指出,为了使 join 命令 能正常工作,所有文件必须按照关键数据域排序。

    [me@linuxbox ~]$ join distros-key-names.txt distros-key-vernums.txt | head
    11/25/2008 Fedora 10
    10/30/2008 Ubuntu 8.10
    06/19/2008 SUSE 11.0
    05/13/2008 Fedora 9
    04/24/2008 Ubuntu 8.04
    11/08/2007 Fedora 8
    10/18/2007 Ubuntu 7.10
    10/04/2007 SUSE 10.3
    05/31/2007 Fedora 7
    04/19/2007 Ubuntu 7.04
    

    也要注意,默认情况下,join 命令使用空白字符做为输入字段的界定符,一个空格作为输出字段 的界定符。这种行为可以通过指定的选项来修改。详细信息,参考 join 命令手册。

    比较文本

    通常比较文本文件的版本很有帮助。对于系统管理员和软件开发者来说,这个尤为重要。 一名系统管理员可能,例如,需要拿现有的配置文件与先前的版本做比较,来诊断一个系统错误。 同样的,一名程序员经常需要查看程序的修改。

    comm

    这个 comm 程序会比较两个文本文件,并且会显示每个文件特有的文本行和共有的文把行。 为了说明问题,通过使用 cat 命令,我们将会创建两个内容几乎相同的文本文件:

    [me@linuxbox ~]$ cat > file1.txt
    a
    b
    c
    d
    [me@linuxbox ~]$ cat > file2.txt
    b
    c
    d
    e
    

    下一步,我们将使用 comm 命令来比较这两个文件:

    [me@linuxbox ~]$ comm file1.txt file2.txt
    a
            b
            c
            d
        e
    

    正如我们所见到的,comm 命令产生了三列输出。第一列包含第一个文件独有的文本行;第二列, 文本行是第二列独有的;第三列包含两个文件共有的文本行。comm 支持 -n 形式的选项,这里 n 代表 1,2 或 3。这些选项使用的时候,指定了要隐藏的列。例如,如果我们只想输出两个文件共享的文本行, 我们将隐藏第一列和第二列的输出结果:

    [me@linuxbox ~]$ comm -12 file1.txt file2.txt
    b
    c
    d
    

    diff

    类似于 comm 程序,diff 程序被用来监测文件之间的差异。然而,diff 是一款更加复杂的工具,它支持 许多输出格式,并且一次能处理许多文本文件。软件开发员经常使用 diff 程序来检查不同程序源码 版本之间的更改,diff 能够递归地检查源码目录,经常称之为源码树。diff 程序的一个常见用例是 创建 diff 文件或者补丁,它会被其它程序使用,例如 patch 程序(我们一会儿讨论),来把文件 从一个版本转换为另一个版本。

    如果我们使用 diff 程序,来查看我们之前的文件实例:

    [me@linuxbox ~]$ diff file1.txt file2.txt
    1d0
    < a
    4a4
    > e
    

    我们看到 diff 程序的默认输出风格:对两个文件之间差异的简短描述。在默认格式中, 每组的更改之前都是一个更改命令,其形式为 range operation range , 用来描述要求更改的位置和类型,从而把第一个文件转变为第二个文件:

    表21-4: diff 更改命令

    改变说明
    r1ar2把第二个文件中位置 r2 处的文件行添加到第一个文件中的 r1 处。
    r1cr2用第二个文件中位置 r2 处的文本行更改(替代)位置 r1 处的文本行。
    r1dr2删除第一个文件中位置 r1 处的文本行,这些文本行将会出现在第二个文件中位置 r2 处。

    在这种格式中,一个范围就是由逗号分隔开的开头行和结束行的列表。虽然这种格式是默认情况(主要是 为了服从 POSIX 标准且向后与传统的 Unix diff 命令兼容), 但是它并不像其它可选格式一样被广泛地使用。最流行的两种格式是上下文模式和统一模式。

    当使用上下文模式(带上 -c 选项),我们将看到这些:

    [me@linuxbox ~]$ diff -c file1.txt file2.txt
    *** file1.txt    2008-12-23 06:40:13.000000000 -0500
    --- file2.txt   2008-12-23 06:40:34.000000000 -0500
    ***************
    *** 1,4 ****
    - a
      b
      c
      d
    --- 1,4 ----
      b
      c
      d
      + e
    

    这个输出结果以两个文件名和它们的时间戳开头。第一个文件用星号做标记,第二个文件用短横线做标记。 纵观列表的其它部分,这些标记将象征它们各自代表的文件。下一步,我们看到几组修改, 包括默认的周围上下文行数。在第一组中,我们看到:

    *** 1,4 ***
    

    其表示第一个文件中从第一行到第四行的文本行。随后我们看到:

    --- 1,4 ---
    

    这表示第二个文件中从第一行到第四行的文本行。在更改组内,文本行以四个指示符之一开头:

    表21-5: diff 上下文模式更改指示符

    指示符意思
    blank上下文显示行。它并不表示两个文件之间的差异。
    -删除行。这一行将会出现在第一个文件中,而不是第二个文件内。
    +添加行。这一行将会出现在第二个文件内,而不是第一个文件中。
    !更改行。将会显示某个文本行的两个版本,每个版本会出现在更改组的各自部分。

    这个统一模式相似于上下文模式,但是更加简洁。通过 -u 选项来指定它:

    [me@linuxbox ~]$ diff -u file1.txt file2.txt
    --- file1.txt 2008-12-23 06:40:13.000000000 -0500
    +++ file2.txt 2008-12-23 06:40:34.000000000 -0500
    @@ -1,4 +1,4 @@
    -a
     b
     c
     d
    +e
    

    上下文模式和统一模式之间最显著的差异就是重复上下文的消除,这就使得统一模式的输出结果要比上下文 模式的输出结果简短。在我们上述实例中,我们看到类似于上下文模式中的文件时间戳,其紧紧跟随字符串 @@ -1,4 +1,4 @@。这行字符串表示了在更改组中描述的第一个文件中的文本行和第二个文件中的文本行。 这行字符串之后就是文本行本身,与三行默认的上下文。每行以可能的三个字符中的一个开头:

    表21-6: diff 统一模式更改指示符

    字符意思
    空格两个文件都包含这一行。
    -在第一个文件中删除这一行。
    +添加这一行到第一个文件中。

    patch

    这个 patch 程序被用来把更改应用到文本文件中。它接受从 diff 程序的输出,并且通常被用来 把较老的文件版本转变为较新的文件版本。让我们考虑一个著名的例子。Linux 内核是由一个 大型的,组织松散的贡献者团队开发而成,这些贡献者会提交固定的少量更改到源码包中。 这个 Linux 内核由几百万行代码组成,虽然每个贡献者每次所做的修改相当少。对于一个贡献者 来说,每做一个修改就给每个开发者发送整个的内核源码树,这是没有任何意义的。相反, 提交一个 diff 文件。一个 diff 文件包含先前的内核版本与带有贡献者修改的新版本之间的差异。 然后一个接受者使用 patch 程序,把这些更改应用到他自己的源码树中。使用 diff/patch 组合提供了 两个重大优点:

    1. 一个 diff 文件非常小,与整个源码树的大小相比较而言。

    2. 一个 diff 文件简洁地显示了所做的修改,从而允许程序补丁的审阅者能快速地评估它。

    当然,diff/patch 能工作于任何文本文件,不仅仅是源码文件。它同样适用于配置文件或任意其它文本。

    准备一个 diff 文件供 patch 程序使用,GNU 文档(查看下面的拓展阅读部分)建议这样使用 diff 命令:

    diff -Naur old_file new_file > diff_file
    

    old_file 和 new_file 部分不是单个文件就是包含文件的目录。这个 r 选项支持递归目录树。

    一旦创建了 diff 文件,我们就能应用它,把旧文件修补成新文件。

    patch < diff_file
    

    我们将使用测试文件来说明:

    [me@linuxbox ~]$ diff -Naur file1.txt file2.txt &gt; patchfile.txt
    [me@linuxbox ~]$ patch &lt; patchfile.txt
    patching file file1.txt
    [me@linuxbox ~]$ cat file1.txt
    b
    c
    d
    e
    

    在这个例子中,我们创建了一个名为 patchfile.txt 的 diff 文件,然后使用 patch 程序, 来应用这个补丁。注意我们没有必要指定一个要修补的目标文件,因为 diff 文件(在统一模式中)已经 在标题行中包含了文件名。一旦应用了补丁,我们能看到,现在 file1.txt 与 file2.txt 文件相匹配了。

    patch 程序有大量的选项,而且还有额外的实用程序可以被用来分析和编辑补丁。

    运行时编辑

    我们对于文本编辑器的经验是它们主要是交互式的,意思是我们手动移动光标,然后输入我们的修改。 然而,也有非交互式的方法来编辑文本。有可能,例如,通过单个命令把一系列修改应用到多个文件中。

    tr

    这个 tr 程序被用来更改字符。我们可以把它看作是一种基于字符的查找和替换操作。 换字是一种把字符从一个字母转换为另一个字母的过程。例如,把小写字母转换成大写字母就是 换字。我们可以通过 tr 命令来执行这样的转换,如下所示:

    [me@linuxbox ~]$ echo "lowercase letters" | tr a-z A-Z
    LOWERCASE LETTERS
    

    正如我们所见,tr 命令操作标准输入,并把结果输出到标准输出。tr 命令接受两个参数:要被转换的字符集以及 相对应的转换后的字符集。字符集可以用三种方式来表示:

    1. 一个枚举列表。例如, ABCDEFGHIJKLMNOPQRSTUVWXYZ

    2. 一个字符域。例如,A-Z 。注意这种方法有时候面临与其它命令相同的问题,归因于 语系的排序规则,因此应该谨慎使用。

    3. POSIX 字符类。例如,[:upper:]

    大多数情况下,两个字符集应该长度相同;然而,有可能第一个集合大于第二个,尤其如果我们 想要把多个字符转换为单个字符:

    [me@linuxbox ~]$ echo "lowercase letters" | tr [:lower:] A
    AAAAAAAAA AAAAAAA
    

    除了换字之外,tr 命令能允许字符从输入流中简单地被删除。在之前的章节中,我们讨论了转换 MS-DOS 文本文件为 Unix 风格文本的问题。为了执行这个转换,每行末尾的回车符需要被删除。 这个可以通过 tr 命令来执行,如下所示:

    tr -d '\r' < dos_file > unix_file
    

    这里的 dos_file 是需要被转换的文件,unix_file 是转换后的结果。这种形式的命令使用转义序列 \r 来代表回车符。查看 tr 命令所支持地完整的转义序列和字符类别列表,试试下面的命令:

    [me@linuxbox ~]$ tr --help
    

    ROT13: 不那么秘密的编码环

    tr 命令的一个有趣的用法是执行 ROT13文本编码。ROT13是一款微不足道的基于一种简易的替换暗码的 加密类型。把 ROT13称为“加密”是大方的;“文本模糊处理”更准确些。有时候它被用来隐藏文本中潜在的攻击内容。 这个方法就是简单地把每个字符在字母表中向前移动13位。因为移动的位数是可能的26个字符的一半, 所以对文本再次执行这个算法,就恢复到了它最初的形式。通过 tr 命令来执行这种编码:

    echo “secret text” | tr a-zA-Z n-za-mN-ZA-M |

    frperg grkg

    再次执行相同的过程,得到翻译结果:

    | _echo “frperg grkg” | tr a-zA-Z n-za-mN-ZA-M+ |

    secret text

    大量的 email 程序和 USENET 新闻读者都支持 ROT13 编码。Wikipedia 上面有一篇关于这个主题的好文章:

    http://en.wikipedia.org/wiki/ROT13

    tr 也可以完成另一个技巧。使用-s 选项,tr 命令能“挤压”(删除)重复的字符实例:

    [me@linuxbox ~]$ echo "aaabbbccc" | tr -s ab
    abccc
    

    这里我们有一个包含重复字符的字符串。通过给 tr 命令指定字符集“ab”,我们能够消除字符集中 字母的重复实例,然而会留下不属于字符集的字符(“c”)无更改。注意重复的字符必须是相邻的。 如果它们不相邻:

    [me@linuxbox ~]$ echo "abcabcabc" | tr -s ab
    abcabcabc
    

    那么挤压会没有效果。

    sed

    名字 sed 是 stream editor(流编辑器)的简称。它对文本流进行编辑,要不是一系列指定的文件, 要不就是标准输入。sed 是一款强大的,并且有些复杂的程序(有整本内容都是关于 sed 程序的书籍), 所以在这里我们不会详尽的讨论它。

    总之,sed 的工作方式是要不给出单个编辑命令(在命令行中)要不就是包含多个命令的脚本文件名, 然后它就按行来执行这些命令。这里有一个非常简单的 sed 实例:

    [me@linuxbox ~]$ echo "front" | sed 's/front/back/'
    back
    

    在这个例子中,我们使用 echo 命令产生了一个单词的文本流,然后把它管道给 sed 命令。sed,依次, 对流文本执行指令 s/front/back/,随后输出“back”。我们也能够把这个命令认为是相似于 vi 中的“替换” (查找和替代)命令。

    sed 中的命令开始于单个字符。在上面的例子中,这个替换命令由字母 s 来代表,其后跟着查找 和替代字符串,斜杠字符做为分隔符。分隔符的选择是随意的。按照惯例,经常使用斜杠字符, 但是 sed 将会接受紧随命令之后的任意字符做为分隔符。我们可以按照这种方式来执行相同的命令:

    [me@linuxbox ~]$ echo "front" | sed 's\_front\_back\_'
    back
    

    通过紧跟命令之后使用下划线字符,则它变成界定符。sed 可以设置界定符的能力,使命令的可读性更强, 正如我们将看到的.

    sed 中的大多数命令之前都会带有一个地址,其指定了输入流中要被编辑的文本行。如果省略了地址, 然后会对输入流的每一行执行编辑命令。最简单的地址形式是一个行号。我们能够添加一个地址 到我们例子中:

    [me@linuxbox ~]$ echo "front" | sed '1s/front/back/'
    back
    

    给我们的命令添加地址 1,就导致只对仅有一行文本的输入流的第一行执行替换操作。如果我们指定另一 个数字:

    [me@linuxbox ~]$ echo "front" | sed '2s/front/back/'
    front
    

    我们看到没有执行这个编辑命令,因为我们的输入流没有第二行。地址可以用许多方式来表达。这里是 最常用的:

    表21-7: sed 地址表示法

    地址说明
    n行号,n 是一个正整数。
    $最后一行。
    /regexp/所有匹配一个 POSIX 基本正则表达式的文本行。注意正则表达式通过 斜杠字符界定。选择性地,这个正则表达式可能由一个备用字符界定,通过\cregexpc 来 指定表达式,这里 c 就是一个备用的字符。
    addr1,addr2从 addr1 到 addr2 范围内的文本行,包含地址 addr2 在内。地址可能是上述任意 单独的地址形式。
    first~step匹配由数字 first 代表的文本行,然后随后的每个在 step 间隔处的文本行。例如 1~2 是指每个位于偶数行号的文本行,5~5 则指第五行和之后每五行位置的文本行。
    addr1,+n匹配地址 addr1 和随后的 n 个文本行。
    addr!匹配所有的文本行,除了 addr 之外,addr 可能是上述任意的地址形式。

    通过使用这一章中早前的 distros.txt 文件,我们将演示不同种类的地址表示法。首先,一系列行号:

    [me@linuxbox ~]$ sed -n '1,5p' distros.txt
    SUSE           10.2     12/07/2006
    Fedora         10       11/25/2008
    SUSE           11.0     06/19/2008
    Ubuntu         8.04     04/24/2008
    Fedora         8        11/08/2007
    

    在这个例子中,我们打印出一系列的文本行,开始于第一行,直到第五行。为此,我们使用 p 命令, 其就是简单地把匹配的文本行打印出来。然而为了高效,我们必须包含选项 -n(不自动打印选项), 让 sed 不要默认地打印每一行。

    下一步,我们将试用一下正则表达式:

    [me@linuxbox ~]$ sed -n '/SUSE/p' distros.txt
    SUSE         10.2     12/07/2006
    SUSE         11.0     06/19/2008
    SUSE         10.3     10/04/2007
    SUSE         10.1     05/11/2006
    

    通过包含由斜杠界定的正则表达式 /SUSE/,我们能够孤立出包含它的文本行,和 grep 程序的功能 是相同的。

    最后,我们将试着否定上面的操作,通过给这个地址添加一个感叹号:

    [me@linuxbox ~]$ sed -n '/SUSE/!p' distros.txt
    Fedora         10       11/25/2008
    Ubuntu         8.04     04/24/2008
    Fedora         8        11/08/2007
    Ubuntu         6.10     10/26/2006
    Fedora         7        05/31/2007
    Ubuntu         7.10     10/18/2007
    Ubuntu         7.04     04/19/2007
    Fedora         6        10/24/2006
    Fedora         9        05/13/2008
    Ubuntu         6.06     06/01/2006
    Ubuntu         8.10     10/30/2008
    Fedora         5        03/20/2006
    

    这里我们看到期望的结果:输出了文件中所有的文本行,除了那些匹配这个正则表达式的文本行。

    目前为止,我们已经知道了两个 sed 的编辑命令,s 和 p。这里是一个更加全面的基本编辑命令列表:

    表21-8: sed 基本编辑命令

    命令说明
    =输出当前的行号。
    a在当前行之后追加文本。
    d删除当前行。
    i在当前行之前插入文本。
    p打印当前行。默认情况下,sed 程序打印每一行,并且只是编辑文件中匹配 指定地址的文本行。通过指定-n 选项,这个默认的行为能够被忽略。
    q退出 sed,不再处理更多的文本行。如果不指定-n 选项,输出当前行。
    Q退出 sed,不再处理更多的文本行。
    s/regexp/replacement/只要找到一个 regexp 匹配项,就替换为 replacement 的内容。 replacement 可能包括特殊字符 &,其等价于由 regexp 匹配的文本。另外, replacement 可能包含序列 \1到 \9,其是 regexp 中相对应的子表达式的内容。更多信息,查看 下面 back references 部分的讨论。在 replacement 末尾的斜杠之后,可以指定一个 可选的标志,来修改 s 命令的行为。
    y/set1/set2执行字符转写操作,通过把 set1 中的字符转变为相对应的 set2 中的字符。 注意不同于 tr 程序,sed 要求两个字符集合具有相同的长度。

    到目前为止,这个 s 命令是最常使用的编辑命令。我们将仅仅演示一些它的功能,通过编辑我们的 distros.txt 文件。我们以前讨论过 distros.txt 文件中的日期字段不是“友好地计算机”模式。 文件中的日期格式是 MM/DD/YYYY,但如果格式是 YYYY-MM-DD 会更好一些(利于排序)。手动修改 日期格式不仅浪费时间而且易出错,但是有了 sed,只需一步就能完成修改:

    [me@linuxbox ~]$ sed 's/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/' distros.txt
    SUSE           10.2     2006-12-07
    Fedora         10       2008-11-25
    SUSE           11.0     2008-06-19
    Ubuntu         8.04     2008-04-24
    Fedora         8        2007-11-08
    SUSE           10.3     2007-10-04
    Ubuntu         6.10     2006-10-26
    Fedora         7        2007-05-31
    Ubuntu         7.10     2007-10-18
    Ubuntu         7.04     2007-04-19
    SUSE           10.1     2006-05-11
    Fedora         6        2006-10-24
    Fedora         9        2008-05-13
    Ubuntu         6.06     2006-06-01
    Ubuntu         8.10     2008-10-30
    Fedora         5        2006-03-20
    

    哇!这个命令看起来很丑陋。但是它起作用了。仅用一步,我们就更改了文件中的日期格式。 它也是一个关于为什么有时候会开玩笑地把正则表达式称为是“只写”媒介的完美的例子。我们 能写正则表达式,但是有时候我们不能读它们。在我们恐惧地忍不住要逃离此命令之前,让我们看一下 怎样来构建它。首先,我们知道此命令有这样一个基本的结构:

    sed 's/regexp/replacement/' distros.txt
    

    我们下一步是要弄明白一个正则表达式将要孤立出日期。因为日期是 MM/DD/YYYY 格式,并且 出现在文本行的末尾,我们可以使用这样的表达式:

    [0-9]{2}/[0-9]{2}/[0-9]{4}$
    

    此表达式匹配两位数字,一个斜杠,两位数字,一个斜杠,四位数字,以及行尾。如此关心_regexp, 那么_replacement_又怎样呢?为了解决此问题,我们必须介绍一个正则表达式的新功能,它出现 在一些使用 BRE 的应用程序中。这个功能叫做_逆参照,像这样工作:如果序列\n 出现在_replacement_中 ,这里 n 是指从 1 到 9 的数字,则这个序列指的是在前面正则表达式中相对应的子表达式。为了 创建这个子表达式,我们简单地把它们用圆括号括起来,像这样:

    ([0-9]{2})/([0-9]{2})/([0-9]{4})$
    

    现在我们有了三个子表达式。第一个表达式包含月份,第二个包含某月中的某天,以及第三个包含年份。 现在我们就可以构建_replacement_,如下所示:

    \3-\1-\2
    

    此表达式给出了年份,一个斜杠,月份,一个斜杠,和某天。

    sed 's/([0-9]{2})/([0-9]{2})/([0-9]{4})$/\3-\1-\2/' distros.txt
    

    我们还有两个问题。第一个是在我们表达式中额外的斜杠将会迷惑 sed,当 sed 试图解释这个 s 命令 的时候。第二个是因为 sed,默认情况下,只接受基本的正则表达式,在表达式中的几个字符会 被当作文字字面值,而不是元字符。我们能够解决这两个问题,通过反斜杠的自由应用来转义 令人不快的字符:

    sed 's/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/' distros.txt
    

    你掌握了吧!

    s 命令的另一个功能是使用可选标志,其跟随替代字符串。一个最重要的可选标志是 g 标志,其 指示 sed 对某个文本行全范围地执行查找和替代操作,不仅仅是对第一个实例,这是默认行为。 这里有个例子:

    [me@linuxbox ~]$ echo "aaabbbccc" | sed 's/b/B/'
    aaaBbbccc
    

    我们看到虽然执行了替换操作,但是只针对第一个字母 “b” 实例,然而剩余的实例没有更改。通过添加 g 标志, 我们能够更改所有的实例:

    [me@linuxbox ~]$ echo "aaabbbccc" | sed 's/b/B/g'
    aaaBBBccc
    

    目前为止,通过命令行我们只让 sed 执行单个命令。使用-f 选项,也有可能在一个脚本文件中构建更加复杂的命令。 为了演示,我们将使用 sed 和 distros.txt 文件来生成一个报告。我们的报告以开头标题,修改过的日期,以及 大写的发行版名称为特征。为此,我们需要编写一个脚本,所以我们将打开文本编辑器,然后输入以下文字:

    # sed script to produce Linux distributions report
    1 i\
    \
    Linux Distributions Report\
    s/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/
    y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
    

    我们将把 sed 脚本保存为 distros.sed 文件,然后像这样运行它:

    [me@linuxbox ~]$ sed -f distros.sed distros.txt
    Linux Distributions Report
    SUSE	10.2	2006-12-07
    FEDORA	10	    2008-11-25
    SUSE	11.0	2008-06-19
    UBUNTU	8.04	2008-04-24
    FEDORA	8	    2007-11-08
    SUSE	10.3	2007-10-04
    UBUNTU	6.10	2006-10-26
    FEDORA	7	    2007-05-31
    UBUNTU	7.10	2007-10-18
    UBUNTU	7.04	2007-04-19
    SUSE	10.1	2006-05-11
    FEDORA	6	    2006-10-24
    FEDORA	9	    2008-05-13
    

    正如我们所见,我们的脚本文件产生了期望的结果,但是它是如何做到的呢?让我们再看一下我们的脚本文件。 我们将使用 cat 来给每行文本编号:

    [me@linuxbox ~]$ cat -n distros.sed
    1 # sed script to produce Linux distributions report
    2
    3 1 i\
    4 \
    5 Linux Distributions Report\
    6
    7 s/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/
    8 y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
    

    我们脚本文件的第一行是一条注释。如同 Linux 系统中的许多配置文件和编程语言一样,注释以#字符开始, 然后是人类可读的文本。注释可以被放到脚本中的任意地方(虽然不在命令本身之中),且对任何 可能需要理解和/或维护脚本的人们都很有帮助。

    第二行是一个空行。正如注释一样,添加空白行是为了提高程序的可读性。

    许多 sed 命令支持行地址。这些行地址被用来指定对输入文本的哪一行执行操作。行地址可能被 表示为单独的行号,行号范围,以及特殊的行号“$”,它表示输入文本的最后一行。

    从第三行到第六行所包含地文本要被插入到地址 1 处,也就是输入文本的第一行中。这个 i 命令 之后是反斜杠回车符,来产生一个转义的回车符,或者就是所谓的连行符。这个序列能够 被用在许多环境下,包括 shell 脚本,从而允许把回车符嵌入到文本流中,而没有通知 解释器(在这是指 sed 解释器)已经到达了文本行的末尾。这个 i 命令,同样地,命令 a(追加文本, 而不是插入文本)和 c(取代文本)命令都允许多个文本行,只要每个文本行,除了最后一行,以一个 连行符结束。实际上,脚本的第六行是插入文本的末尾,它以一个普通的回车符结尾,而不是一个 连行符,通知解释器 i 命令结束了。


    注意:一个连行符由一个斜杠字符其后紧跟一个回车符组成。它们之间不允许有空白字符。


    第七行是我们的查找和替代命令。因为命令之前没有添加地址,所以输入流中的每一行文本 都得服从它的操作。

    第八行执行小写字母到大写字母的字符替换操作。注意不同于 tr 命令,这个 sed 中的 y 命令不 支持字符区域(例如,[a-z]),也不支持 POSIX 字符集。再说一次,因为 y 命令之前不带地址, 所以它会操作输入流的每一行。

    喜欢 sed 的人们也会喜欢。。。

    sed 是一款非常强大的程序,它能够针对文本流完成相当复杂的编辑任务。它最常 用于简单的行任务,而不是长长的脚本。许多用户喜欢使用其它工具,来执行较大的工作。 在这些工具中最著名的是 awk 和 perl。它们不仅仅是工具,像这里介绍的程序,且延伸到 完整的编程语言领域。特别是 perl,经常被用来代替 shell 脚本,来完成许多系统管理任务, 同时它也是一款非常流行网络开发语言。awk 更专用一些。其具体优点是其操作表格数据的能力。 awk 程序通常逐行处理文本文件,这点类似于 sed,awk 使用了一种方案,其与 sed 中地址 之后跟随编辑命令的概念相似。虽然关于 awk 和 perl 的内容都超出了本书所讨论的范围, 但是对于 Linux 命令行用户来说,它们都是非常好的技能。

    aspell

    我们要查看的最后一个工具是 aspell,一款交互式的拼写检查器。这个 aspell 程序是早先 ispell 程序 的继承者,大多数情况下,它可以被用做一个替代品。虽然 aspell 程序大多被其它需要拼写检查能力的 程序使用,但它也可以作为一个独立的命令行工具使用。它能够智能地检查各种类型的文本文件, 包括 HTML 文件,C/C++ 程序,电子邮件和其它种类的专业文本。

    拼写检查一个包含简单的文本文件,可以这样使用 aspell:

    aspell check textfile
    

    这里的 textfile 是要检查的文件名。作为一个实际例子,让我们创建一个简单的文本文件,叫做 foo.txt, 包含一些故意的拼写错误:

    [me@linuxbox ~]$ cat > foo.txt
    The quick brown fox jimped over the laxy dog.
    

    下一步我们将使用 aspell 来检查文件:

    [me@linuxbox ~]$ aspell check foo.txt
    

    因为 aspell 在检查模式下是交互的,我们将看到像这样的一个屏幕:

    The quick brown fox jimped over the laxy dog.
    1)jumped                        6)wimped
    2)gimped                        7)camped
    3)comped                        8)humped
    4)limped                        9)impede
    5)pimped                        0)umped
    i)Ignore                        I)Ignore all
    r)Replace                       R)Replace all
    a)Add                           l)Add Lower
    b)Abort                         x)Exit
    ?
    

    在显示屏的顶部,我们看到我们的文本中有一个拼写可疑且高亮显示的单词。在中间部分,我们看到 十个拼写建议,序号从 0 到 9,然后是一系列其它可能的操作。最后,在最底部,我们看到一个提示符, 准备接受我们的选择。

    如果我们按下 1 按键,aspell 会用单词 “jumped” 代替错误单词,然后移动到下一个拼写错的单词,就是 “laxy”。如果我们选择替代物 “lazy”,aspell 会替换 “laxy” 并且终止。一旦 aspell 结束操作,我们 可以检查我们的文件,会看到拼写错误的单词已经更正了。

    [me@linuxbox ~]$ cat foo.txt
    The quick brown fox jumped over the lazy dog.
    

    除非由命令行选项 --dont-backup 告诉 aspell,否则通过追加扩展名.bak 到文件名中, aspell 会创建一个包含原始文本的备份文件。

    为了炫耀 sed 的编辑本领,我们将还原拼写错误,从而能够重用我们的文件:

    [me@linuxbox ~]$ sed -i 's/lazy/laxy/; s/jumped/jimped/' foo.txt
    

    这个 sed 选项-i,告诉 sed 在适当位置编辑文件,意思是不要把编辑结果发送到标准输出中。sed 会把更改应用到文件中, 以此重新编写文件。我们也看到可以把多个 sed 编辑命令放在同一行,编辑命令之间由分号分隔开来。

    下一步,我们将看一下 aspell 怎样来解决不同种类的文本文件。使用一个文本编辑器,例如 vim(胆大的人可能想用 sed), 我们将添加一些 HTML 标志到文件中:

    <html>
        <head>
              <title>Mispelled HTML file</title>
        </head>
        <body>
              <p>The quick brown fox jimped over the laxy dog.</p>
        </body>
    </html>
    

    现在,如果我们试图拼写检查我们修改的文件,我们会遇到一个问题。如果我们这样做:

    [me@linuxbox ~]$ aspell check foo.txt
    

    我们会得到这些:

    <html>
        <head>
              <title>Mispelled HTML file</title>
        </head>
        <body>
              <p>The quick brown fox jimped over the laxy dog.</p>
        </body>
    </html>
    1) HTML                     4) Hamel
    2) ht ml                    5) Hamil
    3) ht-ml                    6) hotel
    i) Ignore                   I) Ignore all
    r) Replace                  R) Replace all
    a) Add                      l) Add Lower
    b) Abort                    x) Exit
    ?
    

    aspell 会认为 HTML 标志的内容是拼写错误。通过包含-H(HTML)检查模式选项,这个问题能够 解决,像这样:

    [me@linuxbox ~]$ aspell -H check foo.txt
    

    这会导致这样的结果:

    <html>
        <head>
              <title><b>Mispelled</b> HTML file</title>
        </head>
        <body>
              <p>The quick brown fox jimped over the laxy dog.</p>
        </body>
    </html>
    1) HTML                     4) Hamel
    2) ht ml                    5) Hamil
    3) ht-ml                    6) hotel
    i) Ignore                   I) Ignore all
    r) Replace                  R) Replace all
    a) Add                      l) Add Lower
    b) Abort                    x) Exit
    ?
    

    这个 HTML 标志被忽略了,并且只会检查文件中非标志部分的内容。在这种模式下,HTML 标志的 内容被忽略了,不会进行拼写检查。然而,ALT 标志的内容,会被检查。


    注意:默认情况下,aspell 会忽略文本中 URL 和电子邮件地址。通过命令行选项,可以重写此行为。 也有可能指定哪些标志进行检查及跳过。详细内容查看 aspell 命令手册。


    总结归纳

    在这一章中,我们已经查看了一些操作文本的命令行工具。在下一章中,我们会再看几个命令行工具。 诚然,看起来不能立即显现出怎样或为什么你可能使用这些工具为日常的基本工具, 虽然我们已经展示了一些半实际的命令用法的例子。我们将在随后的章节中发现这些工具组成 了解决实际问题的基本工具箱。这将是确定无疑的,当我们学习 shell 脚本的时候, 到时候这些工具将真正体现出它们的价值。

    拓展阅读

    GNU 项目网站包含了本章中所讨论工具的许多在线指南。

    友情提示

    有一些更有趣的文本操作命令值得。在它们之间有:split(把文件分割成碎片), csplit(基于上下文把文件分割成碎片),和 sdiff(并排合并文件差异)。

    展开全文
  • Python 格式化输出 / 占位符的使用

    千次阅读 2020-03-02 20:31:59
    python 占位符 格式化输出: 占位符 %s string 字符串 %d digit 整数型 %f float 浮点数 三个单引号的使用 格式化输出人员信息
  • string.Format字符串格式化说明

    千次阅读 2009-10-20 09:43:00
    答案:十六进制输出 先举几个简单的应用案例:1、格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元)string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0.20)默认格式...
  • 前一篇文章讲述了分类算法的原理知识级案例,包括决策树、KNN、SVM,并通过详细的分类对比实验和可视边界分析与大家总结。本文将详细讲解数据预处理、Jieba分词和文本聚类知识,这篇文章可以说是文本挖掘和自然...
  • 稍后我们会解释#define指令,现在先理解PRAISE后面用双引号括起来的文本是一个字符串。编译器会在末尾加上空字符。 注意(这很重要),scanf()只读取了Angela Plains中的Angela,它在遇到第1个空白(空格、制表符...
  • ①数组,数组的成员是被选中行的id属性(不是rowindex); ②例如,创建一个普通的gridx表格,带checkbox的(具体创建方法见38); ③html代码(点击某个按钮,获取选中的行号中的那个按钮) 测试2 ④...
  • DNS数据包格式内容详解

    万次阅读 多人点赞 2018-11-29 22:36:03
    该记录的值可以是人工可读文本,也可以是机器可读文本。 (常用夹带其他数据比如C&C和文件,用于建立隧道) 查询类型出现在问题字段中,查询类型是类型的一个超集,所有的类型都是可用的查询类型 AXFR 252 A ...
  • 检查日志文件、读取配置 文件、处理数据元素,shell脚本可以帮助我们将文本文件中各种数据的日常处理任务自动。但仅靠shell脚本命令来处理文本文件的内容有点力不从心的。如果想在shell脚本中处理任何类型的数据,...
  • Package: chinese.misc Version... 受R语言中文社区的文章《diRblo|中文文本分析方便工具包chinese.misc简介(附文本样例)》启发,来看看这个刚刚发布的中文处理新包,感谢作者允许转载。因为作者在github上写的有点乱,
  • linux文本编辑器

    万次阅读 多人点赞 2018-04-25 19:18:04
    文本编辑器 vi vim是vi增强版 vim需要安装 sudo apt-get -y install vim vim的三种工作模式 1 编辑模式 命令模式=&gt;编辑模式iaos 按键 作用 i 在光标当前位置插入文本 a 光标的下一...
  • 2) M是一个可选的整数,表示格式化后的参数所占的宽度,如果M是负数,那么格式化后的值就是左对齐的,如果M是正数,那么格式化后的值是右对齐的 3) formatString是另外一个可选的参数,表示格式代码 ...
  • 创建预格式化文本 <h1></h1>  创建最大的标题 <h6></h6>  创建最小的标题 <b></b>  创建黑体字 <i></i>  创建斜体字 <tt></tt>  创建打字机风格的字体 <cite></cite>  创建一个引用 , ...
  • 常常在想,自然语言处理到底在做的是一件什么样的事情?到目前为止,我所接触到的NLP其实都是在做一件事情,即将自然语言转化为一种计算机能够理解的形式。这一点在知识图谱、信息抽取、文本摘要这...
  • 文本过滤

    千次阅读 2008-09-07 21:18:00
    文本过滤1、正则表达式介绍当从一个文件或命令输出中抽取或过滤文本时,可以使用正则表达式,正则表达式是一些特殊或不很特殊的字符串模式的集合。系统自带的所有大的文本过滤工具在某种模式下都支持正则表达式的...
  • 在实际项目开发中最常使用到的工具之一就是富文本编辑器,使用富文本编辑器可以实现所见即所得的效果,且所有富文本编辑器里的内容(包括图片,视频,音乐等文件)全部可以带格式的存入数据库中且只需占用一个字段。...
  • 中文的wiki信息量有限,很短,而wiki的英文内容内多,删减版也减肥得太过。我在网上还看到一个山寨的中文wiki,长得很像,红色的,叫“天下维客”。wiki的中文还是很不错的,但是阅读后建议再阅读英文。  我对...
  • 最佳文本编辑器

    万次阅读 2007-03-02 11:46:00
    原文:donationcoder.com  译者:xbeta@善用佳软 说明:仅做翻译...不代表同意文中观点(xbeta认为最好的编辑器为VIM)。 最佳文本编辑器 当前,好用的文本编辑器比比皆是——无论商业软件还是免费软件。如果你用得
  • 文本服务框架的使用

    千次阅读 2017-03-07 19:40:24
    本节向软件开发者介绍了如何创建文本服务和支持TSF的应用程序的指导方针和标准实现方式。  在Microsoft®平台软件开发包(SDK)的samples文件夹的winui子文件夹下提供了一组可供编译的TSF应用程序和文本服务...
  • xml文本处理

    千次阅读 2012-07-24 13:57:21
    1、 什么是格式正规的XML文档:所以遵守规定的XML基本语法规则的文档(数据)都称为格式正规的XML文档。这类数据在使用时可以不使用DTD或模式来描述它们的结构,它们也称做独立的(或非DTD)XML数据,这些数据不能够...
  • 文本标记语言 -- HTML

    万次阅读 2018-06-28 17:42:47
    ... ... ...HTML是Hyper Text Markup Language(超文本标记语言)的缩写,是构成Web页面的基本...HTML不是一种编程语言,而是一种描述性的标记语言,通过标识符来标识网页中内容的显示方式,例如图片的显示尺寸、文字的...
  • 关于scite文本编辑器的说明scite,也就是SCIntilla based Text Editor, 基于SCIntilla编辑组件的文本编辑器。我们见到的许多文本编辑器都是基于SCIntilla编辑组件的。yidabu.com经过比较发现,同样是基于SCIntilla的...
  • 4.根据菜鸟教程总结的笔记4.1 学习之前要了解的4.2 菜鸟教程HTML笔记直通车[1]HTML基础概念HTML标签HTML 元素[2]HTML基础html标题html段落html链接html图像HTML元素【3】HTML属性【4】HTML折行【5】文本格式化标签...
  • 数据可视平台理论与实践

    万次阅读 2017-08-02 09:32:26
    前面说完了大数据开发平台的核心组件,作业调度系统,接下来讨论一下大数据开发平台的脸面之一,数据可视平台。
  • 另外,该格式是最先得到广泛硬件支持的无损格式,世界知名数码产品如:Rio公司的硬盘随身听Karma,建伍的车载音响MusicKeg以及PhatBox公司的数码播放机都能支持FLAC格式。    前面已经说明,无损压缩是在...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 58,117
精华内容 23,246
关键字:

哪项不是文本格式化内容