我有以下 sed 表达式:
echo 'abcabcabc' | sed -n ':-A s/a/x/1; s/a/&/2;t-A; p'
Run Code Online (Sandbox Code Playgroud)
据说应该用除最后一个之外'a'
的所有出现替换。'x'
所以,预期的输出是这样的:
xbcxbcabc
Run Code Online (Sandbox Code Playgroud)
但实际输出是这样的:
xbcxbcxbc
Run Code Online (Sandbox Code Playgroud)
将全部替换'a'
为'x'
我知道已经有类似的问题了,比如 替换每行中除最后一个字符之外的每个字符
但我在这里尝试使用 sed 条件分支的不同方法。
让我用我自己的理解来分解我的 sed 表达式
首先是 sed 表达式:
xbcxbcabc
Run Code Online (Sandbox Code Playgroud)
sed 将其拉abcabcabc
入模式空间
然后设置一个标签:-A
然后s/a/x/1;
将第一次出现的 替换'a'
为'x'
。现在模式空间包含这个xbcabcabc
s/a/&/2;
检查模式空间是否包含两个'a'
,它确实包含两个 ,因此它'a'
用它们自己替换这两个&
。所以模式空间仍然包含这个xbcabcabc
t-A
由于最近的替换成功,跳回标签-A
从标签开始,-A
它再次执行此操作s/a/x/1;
,将模式空间的内容从 this 变为xbcabcabc
thisxbcxbcabc
s/a/&/2
它检查是否还有两个'a'
。这次模式空间包含 thisxbcxbcabc …
出于性能原因,我想用来find
列出大量文件,但也在每行上包含一个计数器。以下是我到目前为止所拥有的:
local root_dir="."
local ouptut_file="/tmp/foo.txt"
File_Number=99 ## Initial value
echo "" > "${ouptut_file}" ## Initialize file to empty
find "$root_dir" \
-type f \
-depth 2 \
-name '*.xxx' \
-print0 \
| sort -z \
| xargs -0 printf "DoSomething %5d '%s'\n" $[File_Number++] -- \
> "${ouptut_file}"
Run Code Online (Sandbox Code Playgroud)
这输出
DoSomething 99 '--'
DoSomething 0 'dirA/dirB/file1.xxx'
DoSomething 0 'dirA/dirB/file2.xxx'
DoSomething 0 'dirA/dirB/file3.xxx'
Run Code Online (Sandbox Code Playgroud)
我想要的是
DoSomething 100 'dirA/dirB/file1.xxx'
DoSomething 101 'dirA/dirB/file2.xxx'
DoSomething 102 'dirA/dirB/file3.xxx'
Run Code Online (Sandbox Code Playgroud)
如何包含计数器并消除输出中的第一个杂散线。
系统bash
:正在macOS Ventura 13.0.1 上使用
我有一个内核模块,我想分发它(即打包它)。
我想分发它,以便用户不需要做任何其他事情yum/dnf install kmod-mymodule
。
有什么方法可以轻松分发内核模块,以便用户只需要做yum install kmod-mymodule
即可为特定机器编译模块?
如果有一个与分发无关的解决方案,我洗耳恭听!
我有这个文件,其中第七个字段是 yyyymmddhhmmss。我需要将这个数字增加一秒。
到目前为止,我已经想出了:
awk 'BEGIN{FS=OFS="|"} $7=$7+1 ' <file>
Run Code Online (Sandbox Code Playgroud)
它有点工作,但是......如果第七个字段的最后两位数字是“59”,它显然会替换为“60”。
有什么方法可以让 awk 知道该字段是日期,这样我就可以将整个列增加一秒?
当前文件
09099458|1|000|41181|0|0|20221130164738|67
82060649|1|000|36827|0|0|20221130172359|67
Run Code Online (Sandbox Code Playgroud)
预期结果
09099458|1|000|41181|0|0|20221130164739|67
82060649|1|000|36827|0|0|20221130172400|67 <- From 17:23:59 to 17:24:00
Run Code Online (Sandbox Code Playgroud)
提前致谢。
我正在尝试使用 sed 来替换tex 文件中的&
by 。\&
我正在使用sed -i "s/ & / \\\& /g" bibfile.bib;
但是,文件中的结果\ &
并不\&
符合我的预期。欢迎任何帮助,马克
我在 Linux 机器上有一个文件words.txt
,包含以下几行。如何重复每个字符串user
、apple
和banana
,并向它们附加 1 到 4 之间的数字?
user
apple
banana
Run Code Online (Sandbox Code Playgroud)
预期输出:
user1
user2
user3
user4
apple1
apple2
apple3
apple4
banana1
banana2
banana3
banana4
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法,但只适用于 1 个字符串。
seq 1 4 | awk {'print $0 "user"'}
Run Code Online (Sandbox Code Playgroud) 我正在使用 Linux 5.15 和 Ubuntu 22.04。
我有一个使用大量内存的进程。它需要的内存比我机器上的 RAM 还要多。我第一次运行它时,它被 OOM Killer 杀死了。我的理解是:系统内存不足,OOM Killer 被触发,我的进程被杀死。这是有道理的。我也确信这就是发生的事情:我看了一下dmesg
,一切都在那里。
所以我添加了一些交换空间。我不介意这个过程是否需要很长时间才能运行:我不会经常运行它。
我再次运行该过程。这次比第一次跑的时间更长。整个系统变得非常滞后,系统在进行大量交换时就会出现这种情况。它似乎起作用了……然后就死了。不仅进程死了,它的父进程 shell 进程也死了,它的父进程 Tmux 进程、Tmux 进程的父进程 shell 进程,甚至它的父 GNOME 终端进程也死了!但随后谋杀过程停止了:不再有父母死亡。
起初,我以为 OOM Killer 再次被触发——尽管仍有大量交换空间可用——并且它选择终止 GNOME 终端进程。但我查了dmesg
一下,journalctl -k
并没有什么新的东西。没有任何迹象表明 OOM Killer 已被触发。
那么,第一个问题:是否有任何情况可以触发 OOM Killer,而不将任何内容记录到内核环形缓冲区?
让我困惑的是,Linux 内核似乎已经开始交换,但不知何故它交换得不够……或者交换得不够快……或者其他什么。
所以我增加了vm.swappiness
。这确实不应该影响系统稳定性:它只是一个用于性能优化的旋钮。即使vm.swappiness
设置为0
内核,当区域中的可用内存降至临界阈值以下时,内核仍应开始交换。
但似乎它已经开始交换,但交换得还不够……所以我增加了vm.swappiness
鼓励100
它交换更多一点。
然后我再次运行该过程。整个系统变得非常滞后,系统在进行大量交换时就会这样做......直到进程成功运行完成。
那么,第二个问题:为什么内核不使用可用的交换空间,即使空闲内存已降至临界阈值以下并且肯定有足够的可用交换空间?为什么改变会vm.swappiness
带来改变?
更新:
进一步的测试表明该设置vm.swappiness
不是一个可靠的解决方案。即使vm.swappiness
set to ,我也遇到过一些失败100
。它可能会提高该过程成功完成的机会,但我不确定。
在 MacOS 中,您可以使用后缀命名文件夹.app
,并且可以根据内部文件夹结构约定将其作为应用程序从 GUI 启动。
Linux 中存在这样的东西吗?
例如,我可以将一个目录标记为可执行文件吗?当尝试执行该目录时(无论是从 CLI 还是从 GUI),Linux 将在内部查找./main
(或类似的)来执行。
编辑:
这主要只是出于好奇,但就行为而言,我希望知道是否有某种方法可以用一些元数据标记文件夹,告诉 Linux 将其用作内部保存的二进制文件的代理 - 类似于:
mkdir hello-world.app
# Create executable inside folder
echo "#!/bin/bash" > hello-world.app/bin/main
echo "echo Hello World" >> hello-world.app/bin/main
# Add some kind of meta-data to tell Linux what to do when executing folder
echo "execute=bin/main" > hello-world.app/app_manifest
# Mark as executable
chmod +x ./hello-world.app
# Run folder
./hello-world.app
# "Hello World"
Run Code Online (Sandbox Code Playgroud)
我的想法是,这将是一种方便、省力的方式来分发应用程序及其依赖项、文档,同时也可以作为配置的方便目的地。
我想如果一个软件需要一个与系统上安装的动态库不同的动态库,您只需下载适当的动态库并将其放入,hello-world.app/lib
二进制文件会更喜欢本地库而不是系统库。
我知道 Linux 的约定是使用/usr/local …
有没有办法将 Linuxwireguard 模块配置为仅侦听特定 IP 地址的传入连接,而不是默认侦听所有可用地址?我找不到这方面的任何文档。
我有一个 38GB 的文件夹,里面有 800 个 MP4 视频。重新下载后,文件名没有空格,所有单词都连在一起,但还是TitleCase。
所以从TitleCase
我需要Title Case
。
批量重命名这些文件的最有效方法是什么?
我记得很久以前我的发行版中就包含了rename
或autorename
,但现在似乎没有了。