免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1635 | 回复: 9

[学习共享] 我编写的powershell版sed [复制链接]

论坛徽章:
0
发表于 2018-08-24 18:21 |显示全部楼层
-----------------【概述】-----------------
ps找算替简易版.ps1 即 powershell版的简易sed。

1 找、算、替、是啥意思?
1.1 找
1.2 算。
即你可以自己编写函数,用来处理找到的结果,函数运行完毕后,产生要【替】的字符串。
这块功能简单。但我没开发。目前只弄好了找替功能。
1.3 替

论坛徽章:
0
发表于 2018-08-24 18:24 |显示全部楼层
本帖最后由 本友会机友会摄友会 于 2018-11-17 12:32 编辑

区分大小写! 不支持正则!

发不上来,总被吞。不知道有啥关键字过滤。

脚本下载地址:
https://pan.baidu.com/s/1yuqUOhY9lEw65vJ-vceg4w

2 我开发这个替换脚本,为了替换标准化,参数化。简化配置文件的处理。
3 我认为此简易版足够80%用了。免费使用。
4 根据需求,后续会开发块替换版,正则版。或许收费。
5 支持下列os。系统需求:
5.1 win7 + powershell 5.1
5.2 win10 + powershell 5.1
5.3 linux + powershell 6.0,6.1

6 问题反馈:
powershell交流群
QQ群号=183173532

论坛徽章:
0
发表于 2018-08-24 18:25 |显示全部楼层
本帖最后由 本友会机友会摄友会 于 2018-08-30 11:49 编辑

这是一个 查找/替换 工具脚本。功能类似于sed。
我编写的win,linux通用的,powershell版的sed,
和sed比,劣势是不支持正则。

优势是简单。查找的字符串不需要添加转义符。
用中文定义参数名,参数值,容易懂。找什么,替换成啥,一目了然。
win,linux 通用。
支持gbk编码。
不支持正则,99.99%不会出错。不支持正则,我编写脚本简单。你用着也简单。

注意: “找什么” 后面有空格等号,空格多少      !!!  不影响找替。扎找的字符串,无需转义

  1. $某找替参数 = @{
  2. 找什么 =
  3. @'
  4. 这里可以有,不成对的单引号,双引号,也无需转义。
  5. 不用转义,这点比sed好很多
  6. '@
  7. }

  8. & /powershell/ps找算替简易版.ps1  @某找替参数
复制代码

论坛徽章:
0
发表于 2018-08-24 18:25 |显示全部楼层
本帖最后由 本友会机友会摄友会 于 2018-08-24 18:31 编辑

参数说明

-----------------【ps找算替简易版.ps1 参数说明】-----------------
-输入文件全路径 'xxx.txt' 支持win决绝路径,相对路径。支持linux绝对路径,相对路径。

-输出文件全路径 字符串 默认 空
值:
●空值。会备份输入文件。从源文件名,到,源文件名.年月日时分秒.powershell
●“直接写输入文件,不需要备份”
●一个输出文件路径
输出文件已经存在时,会覆盖输出文件!!!



-输入文件编码   是一个数字,如果输入文件有bom头,则会忽略此参数。
默认为空,空则报错退出。也就是说必须【显式指定】此参数
输入错误的编码,将导致输入文件损坏。

数字,对应的【输入文件】编码
20127 Ascii
936 gbk
54936 gb18030
950 big5
1200 Unicode
1201 BigEndianUnicode
12000 UTF32
12001 BigEndianUTF32
65001 UTF8
========================
-找什么 字符串

$某找替参数 = @{
找什么 =
@'
这里可以有,不成对的单引号,双引号,也无需转义。
不用转义,这点比sed好很多
请看,下行我放入一个单引号
        '
'@
}

& /powershell/ps找算替简易版.ps1  @某找替参数

-用正则查找 布尔 。默认 $false 。暂不支持正则查找。
-区分大小写 布尔 。默认 $true 。暂不支持忽略大小写。
-查找返回的结果必须唯一 布尔 默认 $true 。
-查找模式:
值:
●'行' 默认是行。行中含有查找内容,先删除此整行,用 -替换成啥 输入的【字符串】来替换。可以用来 “去除行首#号和空格”。
●'字符串',在整个文件中查找字符串。找到后,用 -替换成啥 输入的【字符串】来替换。 支持查找回车“`n”
●'块',暂不支持。

-找不到则在文件末尾追加 布尔 。默认 $false 。
当 找不到则在文件末尾追加 = $false,找不到关键字,则报错退出。
当 找不到则在文件末尾追加 = $true,找不到关键字,则在文件末尾追加。

========================
-替换成啥 字符串
-返回结果不唯一时 字符串。 默认 '只替换最后一个'
值:
●'只替换第一个'
●'只替换最后一个'
●'全部替换'

-输出文件编码linux 字符串 默认 'utf8无bom' 。如果输入文件有bom头,则会忽略此参数。
值:
●'utf8无bom'
●'utf8有bom'
●'utf16le有bom'

-输出文件编码win 字符串 默认 'utf16le有bom' 。如果输入文件有bom头,则会忽略此参数。
值:
●'utf8无bom'
●'utf8有bom'
●'utf16le有bom'

输出文件,只支持上述三种编码。


论坛徽章:
0
发表于 2018-08-24 18:26 |显示全部楼层
本帖最后由 本友会机友会摄友会 于 2018-08-30 11:33 编辑



重复了,编辑掉,请版主删除,谢谢。

论坛徽章:
0
发表于 2018-08-24 18:43 |显示全部楼层
本帖最后由 本友会机友会摄友会 于 2019-04-17 15:42 编辑

重复,编辑掉。请版主删除。

论坛徽章:
0
发表于 2018-08-24 18:57 |显示全部楼层
本帖最后由 本友会机友会摄友会 于 2018-08-30 11:41 编辑




-----------------【脚本例子。脚本文件名:    gb关闭selinux.ps1  】-----------------
#本例子linux测试通过。
#本例子 先把【ps找算替简易版.ps1】保存在【/powershell/】中
#本例子目的:
#任何带有 SELINUX=enforcing 的行,先清空。后写入SELINUX=disabled。若找不到,则报错。


  1. $gb关闭selinux参数 =
  2. @{
  3. 输入文件全路径     = '/etc/selinux/config'
  4. 输出文件全路径     = ''
  5. 输入文件编码      = 65001
  6. 找什么         = 'SELINUX=enforcing'
  7. 查找返回的结果必须唯一 = $true
  8. 查找模式        = '行'
  9. 替换成啥        = 'SELINUX=disabled'
  10. 返回结果不唯一时    = '全部替换'
  11. 找不到则在文件末尾追加 = $false
  12. }


  13. & /powershell/ps找算替简易版.ps1  @gb关闭selinux参数
复制代码




-----------------【脚本讲解】-----------------
1 先建立一个哈希表,【$gb关闭selinux参数】。powershell哈希表中的空格,tab,空行不影响哈希表的结果。
2 执行【ps找算替.ps1】,按哈希表中的参数替换。
3 输入文件编码 = 65001
如果输入文件有bom头,则会忽略此参数。此例子无bom头,则此参数必须设置,否则报错。
4输出文件全路径 = ''
会备份文件,
5查找替换完毕后,再次运行脚本,会报错“找不到关键字”


-----------------【成品脚本1 脚本文件名:    gb关闭sshd的dns.ps1】-----------------
#本例子linux测试通过。
#本例子 先把【ps找算替简易版v1.22.ps1】保存在【/powershell/】中
#本例子目的:
#任何带有 UseDNS,#UseDNS 的行,先清空。后写入UseDNS no。若找不到,则在文件尾部添加

  1. $gb关闭sshd中的dns =
  2. @{
  3. 输入文件全路径     = '/etc/ssh/sshd_config'
  4. 输入文件编码      = 65001
  5. 输出文件全路径     = ''
  6.    
  7. 找什么 =
  8. @'
  9. UseDNS
  10. '@
  11.    
  12. 替换成啥 =
  13. @'
  14. UseDNS no
  15. '@
  16.    
  17. 查找模式 = '行'
  18. 找不到则在文件末尾追加 = $true
  19. 查找返回的结果必须唯一 = $true
  20. 返回结果不唯一时 = '全部替换'
  21. }


  22. & /powershell/ps找算替简易版v1.22.ps1  @gb关闭sshd中的dns
复制代码




论坛徽章:
0
发表于 2018-08-24 19:07 |显示全部楼层
  1. <#
  2. ps找算替,简易版的sed。
  3. #>

  4. [CmdletBinding()]
  5. Param(
  6.         # v1.24
  7.         [Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()][string]$输入文件全路径,

  8.         [int32]$输入文件编码,

  9.         [string]$输出文件全路径,

  10.         [ValidateSet('utf8无bom','utf8有bom','utf16le有bom')][string]$输出文件编码linux = 'utf8无bom',

  11.         [ValidateSet('utf8无bom','utf8有bom','utf16le有bom')][string]$输出文件编码win = 'utf16le有bom',

  12.         [Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()][string]$找什么,

  13.         [bool]$用正则查找 = $false,

  14.         [bool]$区分大小写 = $true,

  15.         [bool]$查找返回的结果必须唯一 = $true,

  16.         [ValidateSet('字符串','行','块')][string]$查找模式 = '行',

  17.         [Parameter(Mandatory = $true)][string]$替换成啥,

  18.         [ValidateSet('只替换第一个','只替换最后一个','全部替换')][string]$返回结果不唯一时 = '只替换最后一个',

  19.         [bool]$找不到则在文件末尾追加 = $false
  20. )


  21. function 有bom头吗($输入文件全路径2)
  22. {

  23.         if ($PSEdition -eq 'core')
  24.         {
  25.                 $头 = Get-Content -LiteralPath $输入文件全路径2 -AsByteStream -TotalCount 4
  26.         }
  27.         else
  28.         {
  29.                 $头 = Get-Content -LiteralPath $输入文件全路径2 -Encoding Byte -TotalCount 4
  30.         }

  31.         [string]$utf8_BOM = "{0:X}{1:X}{2:X}" -f $头
  32.         [string]$utf16_BOM = "{0:X}{1:X}" -f $头
  33.         [string]$utf32_BOM = "{0:X}{1:X}{2:X}{3:X}" -f $头

  34.         if ($utf8_BOM -eq "EFBBBF")
  35.         {
  36.                 $script:输入文件编码2 = 65001
  37.                 $script:输出文件编码2 = 65001
  38.                 Write-Verbose "UTF-8"
  39.                 return $true
  40.         }

  41.         if ($utf16_BOM -eq "FFFE")
  42.         {
  43.                 $script:输入文件编码2 = 1200
  44.                 $script:输出文件编码2 = 1200
  45.                 Write-Verbose "Unicode"
  46.                 return $true
  47.         }

  48.         if ($utf16_BOM -eq "FEFF")
  49.         {
  50.                 $script:输入文件编码2 = 1201
  51.                 $script:输出文件编码2 = 1201
  52.                 Write-Verbose "Big Endian Unicode"
  53.                 return $true
  54.         }

  55.         if ($utf32_BOM -eq "0000FEFF")
  56.         {
  57.                 $script:输入文件编码2 = 12001
  58.                 $script:输出文件编码2 = 12001
  59.                 Write-Verbose "UTF-32, big-endian"
  60.                 return $true
  61.         }

  62.         if ($utf32_BOM -eq "FFFE0000")
  63.         {
  64.                 $script:输入文件编码2 = 12000
  65.                 $script:输出文件编码2 = 12000
  66.                 Write-Verbose "UTF-32, little-endian"
  67.                 return $true
  68.         }

  69.         return $False
  70. }

  71. $ErrorActionPreference = 'Continue'

  72. if (-not (test-path  -LiteralPath $输入文件全路径 -PathType Leaf ))
  73. {
  74.         Write-Error '错误:找不到输入文件'
  75.         exit 1
  76. }

  77. if ((Get-Item -LiteralPath $输入文件全路径).IsReadOnly -eq $true)
  78. {
  79.         Write-Error '错误:发现只读输入文件'
  80.         exit 2
  81. }

  82. if ((Get-ChildItem -LiteralPath $输入文件全路径).Length -gt 64mb )
  83. {
  84.         Write-Error '输入文件太大'
  85.         exit 3
  86. }

  87. if ($输出文件全路径 -eq '' -or $输出文件全路径 -eq $null)
  88. {
  89.         #备份源文件
  90.         $temp001 = get-date -Format 'yyyy-MM-dd-HH-mm-ss'
  91.         $temp002 = '.' + $temp001 + '.powershell'
  92.         $输入文件全路径bak = (Get-ChildItem -LiteralPath $输入文件全路径).fullname + $temp002
  93.         Copy-Item -LiteralPath $输入文件全路径 -Destination $输入文件全路径bak
  94.         Start-Sleep -Seconds 1
  95.         $输出文件全路径 = $输入文件全路径
  96. }

  97. if ($输出文件全路径 -eq '直接写输入文件,不需要备份')
  98. {
  99.         $输出文件全路径 = $输入文件全路径
  100. }

  101. if (有bom头吗 ($输入文件全路径))
  102. {

  103. }
  104. else
  105. {
  106.         if ($输入文件编码 -eq '' -or $输入文件编码 -eq $null)
  107.         {
  108.                 Write-Error '应输入源文件编码: -输入文件编码'
  109.                 exit 4
  110.         }
  111.         else
  112.         {
  113.                 $编码表 = 936,950,65001,20127,1200,1201,12000,12001,54936
  114.                 if ($输入文件编码 -notin $编码表)
  115.                 {
  116.                         Write-Error '-输入文件编码 值错误'
  117.                         exit 5
  118.                 }
  119.         }
  120. }

  121. if ($script:输入文件编码2 -ne $null -and $script:输入文件编码2 -ne '')
  122. {
  123.         $script:编码对象 = [System.Text.Encoding]::GetEncoding($script:输入文件编码2)
  124.         #有bom头,编码类型指定错误也无妨
  125. }
  126. else
  127. {
  128.         $script:编码对象 = [System.Text.Encoding]::GetEncoding($输入文件编码)
  129.         #无bom头
  130. }

  131. $源文件内容 = [System.IO.File]::ReadAllText($输入文件全路径,$script:编码对象)
  132. $匹配关键字数量 = 0
  133. $找什么偏移量 = 0
  134. $eof = $false
  135. while ($eof -eq $false)
  136. {
  137.         $找什么偏移量 = $源文件内容.IndexOf($找什么,$找什么偏移量)
  138.         if ($找什么偏移量 -ne -1)
  139.         {
  140.                 $匹配关键字数量++
  141.                 $找什么偏移量++
  142.         }
  143.         else
  144.         {
  145.                 $eof = $true
  146.         }
  147. }

  148. if ($匹配关键字数量 -le 0 -and $找不到则在文件末尾追加 -eq $false)
  149. {
  150.         Write-Error '找不到关键字'
  151.         exit 11
  152. }


  153. if ($PSVersionTable.PSVersion.Major -le 4)
  154. {
  155.         $script:PSEdition = 'Desktop'
  156. }

  157. if ($查找返回的结果必须唯一 -eq $true)
  158. {
  159.         if ($匹配关键字数量 -gt 1)
  160.         {
  161.                 Write-Error '查找返回的关键字,超过1个'
  162.                 exit 12
  163.         }
  164. }

  165. if ($用正则查找 -eq $true)
  166. {
  167.         Write-Error '暂时不支持正则查找'
  168.         exit 111
  169. }

  170. if ($区分大小写 -eq $false)
  171. {
  172.         Write-Error '暂不支持忽略大小写'
  173.         exit 112
  174. }

  175. if ($查找模式 -eq '块')
  176. {
  177.         Write-Error '暂不支持块查找'
  178.         exit 113
  179. }

  180. #region main
  181. if ($查找模式 -eq '行')
  182. {
  183.         if ($替换成啥 -isnot [string])
  184.         {
  185.                 Write-Error '替换成什么,应输入字符串'
  186.                 exit 21
  187.                 '此脚本出品人=powershell交流群'
  188.                 'QQ群号=183173532'
  189.         }

  190.         $源文件内容数组 = [System.IO.File]::ReadAllLines($输入文件全路径,$script:编码对象)
  191.         if ($匹配关键字数量 -le 0 -and $找不到则在文件末尾追加 -eq $true)
  192.         {
  193.                 [string]$最后一行 = $替换成啥 + "`n"
  194.                 $源文件内容数组 = $源文件内容数组 + $最后一行
  195.         }
  196.         else
  197.         {
  198.                 $script:已经找到的个数 = 0
  199.                 :aaaaa for ($i = 0;$i -lt $源文件内容数组.length ; $i++)
  200.                 {
  201.                         $行 = $源文件内容数组[$i]
  202.                         switch ($返回结果不唯一时)
  203.                         {
  204.                                 '只替换第一个'
  205.                                 {
  206.                                         if ($行.contains($找什么))
  207.                                         {
  208.                                                 $源文件内容数组[$i] = $替换成啥
  209.                                                 break aaaaa
  210.                                         }
  211.                                 }

  212.                                 '只替换最后一个'
  213.                                 {
  214.                                         if ($行.contains($找什么))
  215.                                         {
  216.                                                 $script:已经找到的个数++
  217.                                                 if ($script:已经找到的个数 -eq $匹配关键字数量)
  218.                                                 {
  219.                                                         $源文件内容数组[$i] = $替换成啥
  220.                                                 }
  221.                                         }
  222.                                 }

  223.                                 '全部替换'
  224.                                 {
  225.                                         if ($行.contains($找什么))
  226.                                         {
  227.                                                 $源文件内容数组[$i] = $替换成啥
  228.                                         }
  229.                                 }

  230.                                 default
  231.                                 {
  232.                                         Write-Error '查找模式=行,内部错误'
  233.                                         exit 22
  234.                                 }
  235.                         }
  236.                 }
  237.         }

  238.         if ($script:输出文件编码2 -ne $null -and $script:输出文件编码2 -ne '')
  239.         {
  240.                 #有bom头
  241.                 [System.IO.File]::WriteAllLines($输出文件全路径,$源文件内容数组,$script:输出文件编码2)
  242.                 exit 0
  243.         }
  244.         else
  245.         {
  246.                 #无bom头
  247.                 if ($PSEdition -eq 'core')
  248.                 {
  249.                         $输出文件编码3 = $输出文件编码linux
  250.                 }

  251.                 if ($PSEdition -eq 'Desktop')
  252.                 {
  253.                         $输出文件编码3 = $输出文件编码win
  254.                 }

  255.                 if ($输出文件编码3 -eq 'utf8无bom')
  256.                 {
  257.                         $utf8无bom编码对象 = New-Object System.Text.UTF8Encoding($False)
  258.                         [System.IO.File]::WriteAlllines($输出文件全路径,$源文件内容数组,$utf8无bom编码对象) #暗含编码转换,把源编码转换成目标。
  259.                         exit 0
  260.                 }

  261.                 if ($script:输出文件编码3 -eq 'utf8有bom')
  262.                 {
  263.                         $utf8有bom编码对象 = [System.Text.Encoding]::UTF8
  264.                         [System.IO.File]::WriteAlllines($输出文件全路径,$源文件内容数组,$utf8有bom编码对象) #暗含编码转换,把源编码转换成目标。
  265.                         exit 0
  266.                 }

  267.                 if ($script:输出文件编码3 -eq 'utf16le有bom')
  268.                 {
  269.                         $utf16le有bom编码对象 = [System.Text.Encoding]::Unicode
  270.                         [System.IO.File]::WriteAlllines($输出文件全路径,$源文件内容数组,$utf16le有bom编码对象) #暗含编码转换,把源编码转换成目标。
  271.                         exit 0
  272.                 }
  273.         }
  274. }

  275. if ($查找模式 -eq '字符串')
  276. {
  277.         $源文件内容 = [System.IO.File]::ReadAllText($输入文件全路径,$script:编码对象)
  278.         if ($匹配关键字数量 -le 0 -and $找不到则在文件末尾追加 -eq $true)
  279.         {
  280.                 [string]$最后一行 = $替换成啥 + "`n"
  281.                 $源文件内容 = $源文件内容 + $最后一行
  282.         }
  283.         else
  284.         {
  285.                 switch ($返回结果不唯一时)
  286.                 {
  287.                         '只替换第一个'
  288.                         {
  289.                                 $找什么偏移量 = $源文件内容.IndexOf($找什么)
  290.                                 $头字符串 = $源文件内容.Substring(0,$找什么偏移量)
  291.                                 $尾字符串开始 = $找什么偏移量 + $找什么.length
  292.                                 $尾字符串结束 = $源文件内容.Length - $尾字符串开始
  293.                                 $尾字符串 = $源文件内容.Substring($尾字符串开始,$尾字符串结束)
  294.                                 $源文件内容 = $头字符串 + $替换成啥 + $尾字符串
  295.                         }

  296.                         '只替换最后一个'
  297.                         {
  298.                                 $找什么偏移量 = $源文件内容.lastIndexOf($找什么)
  299.                                 $头字符串 = $源文件内容.Substring(0,$找什么偏移量)
  300.                                 $尾字符串开始 = $找什么偏移量 + $找什么.length
  301.                                 $尾字符串结束 = $源文件内容.Length - $尾字符串开始
  302.                                 $尾字符串 = $源文件内容.Substring($尾字符串开始,$尾字符串结束)
  303.                                 $源文件内容 = $头字符串 + $替换成啥 + $尾字符串
  304.                         }

  305.                         '全部替换'
  306.                         {
  307.                                 $源文件内容 = $源文件内容.replace($找什么,$替换成啥)
  308.                         }

  309.                         default
  310.                         {
  311.                                 Write-Error '查找模式=字符串,内部错误'
  312.                                 exit 31
  313.                         }
  314.                 }
  315.         }

  316.         if ($script:输出文件编码2 -ne $null -and $script:输出文件编码2 -ne '')
  317.         {
  318.                 #有bom头
  319.                 [System.IO.File]::WriteAllText($输出文件全路径,$源文件内容,$script:编码对象)
  320.                 exit 0
  321.         }
  322.         else
  323.         {
  324.                 #无bom头
  325.                 if ($PSEdition -eq 'core')
  326.                 {
  327.                         $输出文件编码3 = $输出文件编码linux
  328.                 }

  329.                 if ($PSEdition -eq 'Desktop')
  330.                 {
  331.                         $输出文件编码3 = $输出文件编码win
  332.                 }

  333.                 if ($输出文件编码3 -eq 'utf8无bom')
  334.                 {
  335.                         $utf8无bom编码对象 = New-Object System.Text.UTF8Encoding($False)
  336.                         [System.IO.File]::WriteAllText($输出文件全路径,$源文件内容,$utf8无bom编码对象) #暗含编码转换,把源编码转换成目标。
  337.                         exit 0
  338.                 }

  339.                 if ($script:输出文件编码3 -eq 'utf8有bom')
  340.                 {
  341.                         $utf8有bom编码对象 = [System.Text.Encoding]::UTF8
  342.                         [System.IO.File]::WriteAllText($输出文件全路径,$源文件内容,$utf8有bom编码对象) #暗含编码转换,把源编码转换成目标。
  343.                         exit 0
  344.                 }

  345.                 if ($script:输出文件编码3 -eq 'utf16le有bom')
  346.                 {
  347.                         $utf16le有bom编码对象 = [System.Text.Encoding]::Unicode
  348.                         [System.IO.File]::WriteAllText($输出文件全路径,$源文件内容,$utf16le有bom编码对象) #暗含编码转换,把源编码转换成目标。
  349.                         exit 0
  350.                 }
  351.         }
  352. }

  353. #endregion main


复制代码


分享脚本费劲  

论坛徽章:
0
发表于 2019-04-16 15:35 |显示全部楼层
支持源文件修改不

论坛徽章:
0
发表于 2019-04-17 15:47 |显示全部楼层
支持啊,源文件修改,默认会备份。
7楼的第一个例子,就是修改源文件。

比如/tmp/a.txt   默认先复制成 /tmp/a日期时间.txt
然后在修改。

而找替后,输出到另一个文件。是不备份源文件的。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


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

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP