bak.sql的内容为:
1 -- MySQL dump 10.14 Distrib 5.5.60-MariaDB, for Linux (x86_64)
2 --
3 -- Host: localhost Database: suck_db
4 -- ------------------------------------------------------
5 -- Server version 5.5.60-MariaDB
6
7 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
8 /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
9 /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
10 /*!40101 SET NAMES utf8 */;
11 /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
12 /*!40103 SET TIME_ZONE='+00:00' */;
13 /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
14 /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
15 /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
16 /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
17
18 --
19 -- Current Database: `suck_db`
20 --
21
22 CREATE DATABASE /*!32312 IF NOT EXISTS*/ `suck_db` /*!40100 DEFAULT CHARACTER SET latin1 */;
23
24 USE `suck_db`;
25
26 --
27 -- Table structure for table `suck_t`
28 --
29
30 DROP TABLE IF EXISTS `suck_t`;
31 /*!40101 SET @saved_cs_client = @@character_set_client */;
32 /*!40101 SET character_set_client = utf8 */;
33 CREATE TABLE `suck_t` (
34 `id` int(10) NOT NULL AUTO_INCREMENT,
35 `name` varchar(30) NOT NULL DEFAULT '',
36 `age` tinyint(4) NOT NULL DEFAULT '0',
37 PRIMARY KEY (`id`)
38 ) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=latin1;
39 /*!40101 SET character_set_client = @saved_cs_client */;
40
41 --
42 -- Dumping data for table `suck_t`
43 --
44
45 LOCK TABLES `suck_t` WRITE;
46 /*!40000 ALTER TABLE `suck_t` DISABLE KEYS */;
47 INSERT INTO `suck_t` VALUES (1,'tom1',11),(2,'tom2',11),(3,'tom3',11),(4,'tom4',11),(5,'tom5',11),(6,'tom5',11),(7,'tom5',11),(8,'tom5',11),(9,'tom5',11),(10,'tom5',11),(11,'tom5',11),(12,'tom5',11),(13,'tom5',11),(14,'tom5',11),(15,'tom5',11),(16,'tom5',11),(17,'tom5',11),(18,'tom5',11),(19,'tom5',11),(20,'tom5',11),(21,'tom5',11),(22,'tom5',11),(23,'tom5',11),(24,'tom5',11),(25,'tom5',11),(26,'tom5',11),(27,'tom5',11);
48 /*!40000 ALTER TABLE `suck_t` ENABLE KEYS */;
49 UNLOCK TABLES;
50 /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
51
52 /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
53 /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
54 /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
55 /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
56 /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
57 /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
58 /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
59
60 -- Dump completed on 2018-12-12 1:02:27
我跑步时
sed -e '/./{H;$!d;}' -e 'x;/CREATE TABLE `suck_t`/!d;q' bak.sql
输出为:
DROP TABLE IF EXISTS `suck_t`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `suck_t` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(30) NOT NULL DEFAULT '',
`age` tinyint(4) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
此命令的目的是从bak.sql
文件中提取创建表扇区。
我真的很困惑,它如何工作?
还有{H;$!d;}
,为什么要用括号呢?大括号和不带大括号有什么区别?
我的理解是, 执行'/./{H;$!d;}'之后,模式空间包括10个空行,最后一行,保持空间包括所有非空行。 即
模式空间为:
1
2
3
4
5
6
7
8
9
10
11 -- Dump completed on 2018-12-12 1:02:27
容纳空间为:
1 -- MySQL dump 10.14 Distrib 5.5.60-MariaDB, for Linux (x86_64)
2 --
3 -- Host: localhost Database: suck_db
4 -- ------------------------------------------------------
5 -- Server version 5.5.60-MariaDB
6 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
7 /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
8 /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
9 /*!40101 SET NAMES utf8 */;
10 /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
11 /*!40103 SET TIME_ZONE='+00:00' */;
12 /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
13 /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
14 /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
15 /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
16 --
17 -- Current Database: `suck_db`
18 --
19 CREATE DATABASE /*!32312 IF NOT EXISTS*/ `suck_db` /*!40100 DEFAULT CHARACTER SET latin1 */;
20 USE `suck_db`;
21 --
22 -- Table structure for table `suck_t`
23 --
24 DROP TABLE IF EXISTS `suck_t`;
25 /*!40101 SET @saved_cs_client = @@character_set_client */;
26 /*!40101 SET character_set_client = utf8 */;
27 CREATE TABLE `suck_t` (
28 `id` int(10) NOT NULL AUTO_INCREMENT,
29 `name` varchar(30) NOT NULL DEFAULT '',
30 `age` tinyint(4) NOT NULL DEFAULT '0',
31 PRIMARY KEY (`id`)
32 ) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=latin1;
33 /*!40101 SET character_set_client = @saved_cs_client */;
34 --
35 -- Dumping data for table `suck_t`
36 --
37 LOCK TABLES `suck_t` WRITE;
38 /*!40000 ALTER TABLE `suck_t` DISABLE KEYS */;
39 INSERT INTO `suck_t` VALUES (1,'tom1',11),(2,'tom2',11),(3,'tom3',11),(4,'tom4',11),(5,'tom5',11),(6,'tom5',11),(7,'tom5',11),(8,'tom5',11),(9,'tom5',11),(10,'tom5',11),(11,'tom5',11),(12,'tom5',11),(13,'tom5',11),(14,'tom5',11),(15,'tom5',11),(16,'tom5',11),(17,'tom5',11),(18,'tom5',11),(19,'tom5',11),(20,'tom5',11),(21,'tom5',11),(22,'tom5',11),(23,'tom5',11),(24,'tom5',11),(25,'tom5',11),(26,'tom5',11),(27,'tom5',11);
40 /*!40000 ALTER TABLE `suck_t` ENABLE KEYS */;
41 UNLOCK TABLES;
42 /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
43 /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
44 /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
45 /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
46 /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
47 /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
48 /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
49 /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
50 -- Dump completed on 2018-12-12 1:02:27
执行'x'后,将切换保持空间和模式空间,因此模式空间包括所有非空行,而保持空间包括一堆空行和最后一行。
模式空间为:
1 -- MySQL dump 10.14 Distrib 5.5.60-MariaDB, for Linux (x86_64)
2 --
3 -- Host: localhost Database: suck_db
4 -- ------------------------------------------------------
5 -- Server version 5.5.60-MariaDB
6 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
7 /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
8 /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
9 /*!40101 SET NAMES utf8 */;
10 /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
11 /*!40103 SET TIME_ZONE='+00:00' */;
12 /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
13 /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
14 /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
15 /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
16 --
17 -- Current Database: `suck_db`
18 --
19 CREATE DATABASE /*!32312 IF NOT EXISTS*/ `suck_db` /*!40100 DEFAULT CHARACTER SET latin1 */;
20 USE `suck_db`;
21 --
22 -- Table structure for table `suck_t`
23 --
24 DROP TABLE IF EXISTS `suck_t`;
25 /*!40101 SET @saved_cs_client = @@character_set_client */;
26 /*!40101 SET character_set_client = utf8 */;
27 CREATE TABLE `suck_t` (
28 `id` int(10) NOT NULL AUTO_INCREMENT,
29 `name` varchar(30) NOT NULL DEFAULT '',
30 `age` tinyint(4) NOT NULL DEFAULT '0',
31 PRIMARY KEY (`id`)
32 ) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=latin1;
33 /*!40101 SET character_set_client = @saved_cs_client */;
34 --
35 -- Dumping data for table `suck_t`
36 --
37 LOCK TABLES `suck_t` WRITE;
38 /*!40000 ALTER TABLE `suck_t` DISABLE KEYS */;
39 INSERT INTO `suck_t` VALUES (1,'tom1',11),(2,'tom2',11),(3,'tom3',11),(4,'tom4',11),(5,'tom5',11),(6,'tom5',11),(7,'tom5',11),(8,'tom5',11),(9,'tom5',11),(10,'tom5',11),(11,'tom5',11),(12,'tom5',11),(13,'tom5',11),(14,'tom5',11),(15,'tom5',11),(16,'tom5',11),(17,'tom5',11),(18,'tom5',11),(19,'tom5',11),(20,'tom5',11),(21,'tom5',11),(22,'tom5',11),(23,'tom5',11),(24,'tom5',11),(25,'tom5',11),(26,'tom5',11),(27,'tom5',11);
40 /*!40000 ALTER TABLE `suck_t` ENABLE KEYS */;
41 UNLOCK TABLES;
42 /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
43 /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
44 /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
45 /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
46 /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
47 /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
48 /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
49 /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
50 -- Dump completed on 2018-12-12 1:02:27
容纳空间为:
1
2
3
4
5
6
7
8
9
10
11 -- Dump completed on 2018-12-12 1:02:27
执行'/ CREATE TABLE suck_t /!d'之后,模式空间中除包含CREATE TABLE suck_t的行以外的所有行均被删除。所以输出是:
27 CREATE TABLE `suck_t` (
我在哪里错了?
答案 0 :(得分:2)
这是sed命令的作用:
$("#cal thead th.filtro").each( function ( i) {
var select = $('<select id="cmba'+i+'" class="combo"><option value="">All</option></select>')
.appendTo( $(this).empty() )
.on( 'change', function () {
var cal = $('#cal').DataTable();
cal.column( i )
.search( $(this).val() )
.draw();
readRecord();
$("#cal thead th.filtro").each( function (x) {
if (x > i){//empty all the selects at the right of the current
$("#cmba"+x).empty();
cal.column(x).search("").draw();//i clear all filters of the selects to the right of the current one.
}
});
$("#cal thead th.filtro").each( function (x) {
if (x > i){//i add all option with empty value so no filter
$("#cmba"+x).append("<option value=''>All</option>");
cal.column(x, { search:'applied' } ).data().unique().sort().each(function(value, index) {//add filtered values to the select
$("#cmba"+x).append( '<option value="'+value+'">'+value+'</option>' )
});
}
});
} );
var cal = $('#cal').DataTable();
cal.column( i ).data().unique().sort().each( function ( d, j ) {
select.append( '<option value="'+d+'">'+d+'</option>' )
} );
} );
换句话说:它打印包含# If a line is non-empty
/./ {
# Append line to hold space
H
# For every line but the last of the file, delete pattern space (print
# nothing) and start next cycle
$! d
}
# If we are here, the line was either empty or is the last line
# Swap pattern space and hold space
x
# If the pattern space does not match "CREATE TABLE `suck_t`, delete it and
# start new cycle
/CREATE TABLE `suck_t`/! d
# If we are here, the pattern space matches the "CREATE TABLE" pattern from
# above
# Print current line and quit
q
的每个用空行分隔的段落。由于输入文件仅包含一个包含该字符串的段落,因此 actual 输出就是这样:
CREATE TABLE `suck_t`
空白行(
LOCK TABLES `suck_t` WRITE; /*!40000 ALTER TABLE `suck_t` DISABLE KEYS
*/; INSERT INTO `suck_t` VALUES (1,'tom1',11),(2,'tom2',11),(3,'tom3',11),(4,'tom4',11),(5,'tom5',11),(6,'tom5',11),(7,'tom5',11),(8,'tom5',11),(9,'tom5',11),(10,'tom5',11),(11,'tom5',11),(12,'tom5',11),(13,'tom5',11),(14,'tom5',11),(15,'tom5',11),(16,'tom5',11),(17,'tom5',11),(18,'tom5',11),(19,'tom5',11),(20,'tom5',11),(21,'tom5',11),(22,'tom5',11),(23,'tom5',11),(24,'tom5',11),(25,'tom5',11),(26,'tom5',11),(27,'tom5',11); /*!40000 ALTER TABLE `suck_t` ENABLE KEYS */; UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
插入一行)和第三段的两行从底部开始。
您的输出包含换行符,这些换行符既不在输入中也不由sed脚本引入。
关于括号的问题:它们将命令分组。如果我说
H
这意味着“对于匹配/./H;$!d
的每一行,执行.
;然后,对于每一行,除非最后一行,否则将其删除”。
另一方面,
H
表示“对于匹配/./{H;$!d}
的每一行,执行.
并删除它,除非它是最后一行”。
第一个命令将删除一个空行,因为每行都运行H
;第二个命令将完全跳过空行。