小编phk*_*phk的帖子

使用 sed 查找和替换复杂字符串(最好使用正则表达式)

我有一个包含以下内容的文件:

<username><![CDATA[name]]></username>
<password><![CDATA[password]]></password>
<dbname><![CDATA[name]]></dbname>
Run Code Online (Sandbox Code Playgroud)

我需要制作一个脚本,将第一行中的“name”更改为“something”,将第二行中的“password”更改为“somethingelse”,将第三行中的“name”更改为“somethingdifferent”。我不能依赖这些在文件中出现的顺序,所以我不能简单地用“something”替换第一次出现的“name”,用“somethingdifferent”替换第二次出现的“name”。我实际上需要搜索周围的字符串,以确保我找到并替换了正确的东西。

到目前为止,我已尝试使用此命令来查找和替换第一个“名称”出现:

sed -i "s/<username><![CDATA[name]]><\/username>/something/g" file.xml
Run Code Online (Sandbox Code Playgroud)

但是它不起作用所以我认为其中一些字符可能需要转义等。

理想情况下,我希望能够使用正则表达式来匹配两个“用户名”出现并仅替换“名称”。像这样的东西,但有sed

<username>.+?(name).+?</username>
Run Code Online (Sandbox Code Playgroud)

并将括号中的内容替换为“某物”。

这可能吗?

sed quoting regular-expression

159
推荐指数
5
解决办法
51万
查看次数

使用 shell 检测初始化系统

这可能与检测操作系统有关,但我特别需要系统上当前使用的 init 系统。

Fedora 15 和 Ubuntu 现在使用 systemd,Ubuntu 过去使用 Upstart(很长时间默认直到 15.04),而其他人使用 System V 的变体。

我有一个应用程序,我正在编写它作为跨平台守护程序。初始化脚本是根据可以在配置时传入的参数动态生成的。

我想做的只是为他们正在使用的特定初始化系统生成脚本。这样,安装脚本可以在没有参数的情况下以 root 身份合理运行,并且守护进程可以自动“安装”。

这是我想出的:

  • 在 /bin 中搜索 systemd、upstart 等
  • 将 /proc/1/comm 与 systemd、upstart 等进行比较
  • 询问用户

这样做的最佳跨/平台方式是什么?

有点相关,我可以依赖 bash 来支持大多数 *nix 还是依赖于发行版/操作系统?

目标平台:

  • 苹果系统
  • Linux(所有发行版)
  • BSD(所有版本)
  • Solaris、Minix 和其他 *nix

shell-script init portability

103
推荐指数
6
解决办法
5万
查看次数

提取双引号之间的值

我的查询是提取双引号之间的值""。样本输入是:

10.219.41.68 - - - [11/Jun/2014:10:23:04 -0400] Sec:0 MicSec:1797 "GET /balancer-manager HTTP/1.1" 200 28980 "-" "curl/7.15.5 (i386) -redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5"

我有很大的日志文件,所以每行的值可能会有所不同,需要提取第一次出现双引号之间的值......

预期输出:

GET /balancer-manager HTTP/1.1
Run Code Online (Sandbox Code Playgroud)

任何人有任何想法,然后请提出建议。

awk

23
推荐指数
2
解决办法
7万
查看次数

终止屏幕监控串口

我正在使用screen /dev/tty-MyDevice查看串行端口上的流量。

Ctrl+D不会导致屏幕终止。

我必须做什么才能终止它?

gnu-screen serial-port serial-console

23
推荐指数
3
解决办法
5万
查看次数

在源更新时使用 rsync 是否安全?

rsync假设源文件系统在 rsync 运行时很可能被修改,当源文件系统被挂载和可写时使用它是否安全?我认为在竞争条件下我可能不会得到最新的修改,但是否有任何损坏的风险?

backup rsync concurrency

22
推荐指数
1
解决办法
2万
查看次数

是否有设置目标应用程序的第零个参数的 POSIX 方法?

bash你可以用exec -azsh你也可以替代设置ARGV0具有一定的第0个参数来执行程序,但也有这样做的POSIX方式?

正如这条评论中所建议的您可以创建一个(临时)符号链接来实现这一点,但这样我就无法将新的第零个参数值设置为真正的任意值,例如具有特定绝对路径的命令。那么有没有其他解决办法呢?

shell shell-script posix exec

21
推荐指数
2
解决办法
1810
查看次数

捕获 SIGINT 等时保留退出代码?

如果我使用trap如在http://linuxcommand.org/wss0160.php#trap上描述的那样在退出之前捕获 ctrl-c(或类似的)和清理,那么我正在更改返回的退出代码。

现在这可能不会在现实世界中产生影响(例如,因为退出代码不可移植,而且在进程终止时的默认退出代码中讨论的那样并不总是明确的)但我仍然想知道是否有真的没有办法阻止这种情况并返回中断脚本的默认错误代码吗?

示例(在 bash 中,但不应将我的问题视为特定于 bash 的问题):

#!/bin/bash
trap 'echo EXIT;' EXIT
read -p 'If you ctrl-c me now my return code will be the default for SIGTERM. ' _
trap 'echo SIGINT; exit 1;' INT
read -p 'If you ctrl-c me now my return code will be 1. ' _
Run Code Online (Sandbox Code Playgroud)

输出:

$ ./test.sh # doing ctrl-c for 1st read
If you ctrl-c me now my return code will be the …
Run Code Online (Sandbox Code Playgroud)

shell signals shell-script exit trap

18
推荐指数
4
解决办法
2万
查看次数

/dev/input - 这到底是什么?

我很好奇硬件如何与操作系统交互并看到这篇文章:键盘输入和文本输出如何工作?

似乎很多魔法都发生在 /dev/input 目录中。我决定看看我自己的操作系统(Ubuntu 16.10),看看我能找到什么。所有这些文件都列为 0 字节,当我这样做时,我会sudo cat mouse0 | hexdump -C得到大量如下所示的十六进制数据:

00000000  b3 82 8a 58 00 00 00 00  53 74 09 00 00 00 00 00  |...X....St......|
00000010  01 00 1c 00 00 00 00 00  b3 82 8a 58 00 00 00 00  |...........X....|
00000020  53 74 09 00 00 00 00 00  00 00 00 00 00 00 00 00  |St..............|
00000030  b6 82 8a 58 00 00 00 00  06 56 …
Run Code Online (Sandbox Code Playgroud)

linux devices

15
推荐指数
2
解决办法
2万
查看次数

我应该在 apt sources.list 中使用 http 还是 ftp 链接

我应该使用httpftp链接/etc/apt/sources.list吗?

我的意思是使用类似的东西

deb ftp://ftp.debian.org/debian/ squeeze main contrib. non-free
deb-src ftp://ftp.debian.org/debian/ squeeze main contrib. non-free
Run Code Online (Sandbox Code Playgroud)

比使用更好或更差

deb http://ftp.debian.org/debian/ squeeze main contrib. non-free
deb-src http://ftp.debian.org/debian/ squeeze main contrib. non-free
Run Code Online (Sandbox Code Playgroud)

?

我想作为apt用途wget去取东西,这是一样的,询问是否wget是更快的ftp

ubuntu debian package-management

12
推荐指数
1
解决办法
3852
查看次数

仅删除双引号内的逗号

在文本文件中,我想删除,(逗号)和"(引号)(仅当双引号包含以逗号分隔的数字时)。

56,72,"12,34,54",x,y,"foo,a,b,bar"
Run Code Online (Sandbox Code Playgroud)

预期输出

56,72,123454,x,y,"foo,a,b,bar"
Run Code Online (Sandbox Code Playgroud)

注意:我显示上面的行只是作为一个例子。我的文本文件包含多行如上,双引号中用逗号分隔的数字应该有所不同。那是,

56,72,"12,34,54",x,y,"foo,a,b,bar"
56,92,"12,34",x,y,"foo,a,b,bar"
56,72,"12,34,54,78,76,54,67",x,y,"foo,a,b,bar"
56,72,x,y,"foo,a,b,bar","12,34,54"
56,72,x,y,"foo,a,b,bar","12,34,54","45,57,84,92","bar,foo"
Run Code Online (Sandbox Code Playgroud)

预期输出:

56,72,123454,x,y,"foo,a,b,bar"
56,92,1234,x,y,"foo,a,b,bar"
56,72,12345478765467,x,y,"foo,a,b,bar"
56,72,x,y,"foo,a,b,bar",123454
56,72,x,y,"foo,a,b,bar",123454,45578492,"bar,foo"
Run Code Online (Sandbox Code Playgroud)

n双引号内有许多数字,以逗号分隔。并且还保留包含字符的双引号。

我喜欢sed文本处理工具。如果您sed为此发布任何解决方案,我很高兴。

sed text-processing csv

11
推荐指数
3
解决办法
1万
查看次数