windows cmd 复制 .​​sql 文件中两点之间的文本并写入另一个 .sql 文件

windows cmd to copy the text between two points in a .sql file and write to another .sql File

有一个 mySQL 转储文件 (file.sql),其中包含数据库的 table 结构和插入语句。

--DO NOT COPY
--DO NOT COPY
-- Table structure for table `address`
--

DROP TABLE IF EXISTS `address`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `address` (
`ENCODEDKEY` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`ADDRESSTYPE` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT 
NULL,
`CITY` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `address`
--

 LOCK TABLES `address` WRITE;
/*!40000 ALTER TABLE `address` DISABLE KEYS */;
INSERT INTO `address` VALUES ( 'ENCODEDKEY','ADDRESSTYPE','CITY');
/*!40000 ALTER TABLE `address` ENABLE KEYS */;
UNLOCK TABLES;
--DO NOT COPY
--DO NOT COPY

我想从起点到终点的两点之间复制此 file.sql 中的文本。

起点应该是=

的确切字符串

Table structure for table 'find_tablename'

结束点应该是=

的确切字符串

UNLOCK TABLES;

我想 copy/read 这两点之间的所有文本并写入一个新的 .sql 文件

这个使用 SED 的 Unix 命令完成任务:

sed -n -e '/-- Table structure for table `address`/,/UNLOCK TABLES/p' file.sql > new_file.sql

但是我正在使用命令行 (cmd) 寻找 windows 等效项。我开始使用 @type 命令执行此操作,但我需要某种 IF 语句来告诉进程仅复制这两个点之间的所有文本并写入新的 .sql 文件。

@type C:\Users\Documents\file.sql > C:\Users\Documents\new_file.sql

我认为没有针对这种特定情况的命令。我希望你不会在 cmd.exe.

中尝试这个

在 PowerShell 中,您可以这样做:

$write = $false
$(switch -CaseSensitive -File ("file.sql") {
    '-- Table structure for table `address`' { $write = $true; $_ }
    'UNLOCK TABLES;' { if ($write) { $_; break; } }
    default { if ($write) { $_ }}
}) | Set-Content "new_file.sql"

如果您更经常需要这样的东西,您可以为它编写自己的函数。

您也可以在 powershell 中使用正则表达式来获得类似的结果

$pattern = '(?s)(-- Table structure.+UNLOCK TABLES;\r?\n)'

$rawcontent = Get-Content -Path C:\Users\Documents\file.sql -Raw

if($rawcontent -match $pattern){
    Set-Content -Path C:\Users\Documents\new_file.sql -Value $matches.1
}

请注意 Get-Content 上的 -Raw 选项需要将所有内容收集为一个字符串。 (?s) 是表示单个字符串的正则表达式修饰符。

为了便于阅读,我把命令分开了,你也可以压缩成

if((Get-Content -Path C:\Users\Documents\file.sql -Raw) -match '(?s)(-- Table structure.+UNLOCK TABLES;\r?\n)'){
    Set-Content -Path C:\Users\Documents\new_file.sql -Value $matches.1
}

Set-Content -Path C:\Users\Documents\new_file.sql -Value $(if((Get-Content -Path C:\Users\Documents\file.sql -Raw) -match '(?s)(-- Table structure.+UNLOCK TABLES;\r?\n)'){$matches.1})

甚至

Set-Content -Path C:\Users\Documents\new_file.sql -Value (Get-Content -Path C:\Users\Documents\file.sql -Raw | Select-String -Pattern '(?s)(-- Table structure.+UNLOCK TABLES;\r?\n)').matches.value

如果 sed 削减它

然后从 https://github.com/mbuilov/sed-windows

尝试 windows sed 端口

一个文件 300-400 KB 32 位或 64 位(不保证但在这种情况下似乎有效)例如

curl -o sed.exe https://raw.githubusercontent.com/mbuilov/sed-windows/master/sed-4.8-x64.exe

windows 的语法需要“双引号”

sed.exe -n -e "/-- Table structure for table `address`/,/UNLOCK TABLES/p" test.sql > new_file.sql
-- Table structure for table `address`
--

DROP TABLE IF EXISTS `address`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `address` (
`ENCODEDKEY` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`ADDRESSTYPE` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT
NULL,
`CITY` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `address`
--

 LOCK TABLES `address` WRITE;
/*!40000 ALTER TABLE `address` DISABLE KEYS */;
INSERT INTO `address` VALUES ( 'ENCODEDKEY','ADDRESSTYPE','CITY');
/*!40000 ALTER TABLE `address` ENABLE KEYS */;
UNLOCK TABLES;