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;
有一个 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;