天道酬勤,学无止境

shell

Shell: Ignore escape sequences while replacing a pattern

问题 我已经搜索了这个主题并看到了一些示例,但不知何故它对我不起作用。 我必须在 shell 脚本(包含文件路径和扩展名)的文件中用另一行替换一行。 我正在使用以下命令,但替换不起作用。 line='a|b|c|\\folder\file.txt' upd_line='a|b|c|\\folder\file.txt|d' sed -i 's#$line#$upd_line#g' sample.txt sample.txt 内容: HDR|date a|b|c|\\folder\file.txt 我预计第二行将替换为 $upd_line 的内容,但它保持不变。 请告知我做错了什么。 我在 bash 和 ksh 中尝试过,但没有成功。 回答1 这可能对您有用(GNU sed 和 bash): a='a|b|c|\\folder\file.txt' b='a|b|c|\folder\file.txt|d' qs(){ sed <<<$1 's/[][\\.*^$]/\\&/g';} sed "s/$(qs $a)/$(qs $b)/" file 这将创建一个函数qs ,它将变量字符串转换为 sed 正则表达式和替换中可接受的形式。 注意在 sed 命令周围使用双引号; 这允许 shell 插入 shell 变量和函数调用。 如果在您选择的终端中使用了 GNU readline,CMe

2022-07-11 09:57:59    分类:技术分享    bash   shell   unix   sed

Replace string starting with in between two lines using bash

问题 有没有办法在不使用循环的情况下使用 sed 替换整个文件中字符串的开头? 例如,我的源数据如下: str_address: 123 main street str_desc: Apt3 str_desc: 2nd floor str_city: new york str_desc: mailing address 现在,该文件将有数千个地址,但我希望任何时候出现在“ str_desc ”之后和“ str_address ”之前的“ str_city ”都被替换为“ str_address ”,但是出现在str_city之后的任何“ str_desc ”都保持不变。 期望的输出: str_address: 123 main street str_address: Apt3 str_address: 2nd floor str_city: new york str_desc: mailing address 我可以提取这些信息, cat file | awk '/str_city/{f=0} f; /str_address/{f=1}' 这使 str_desc: Apt3 str_desc: 2nd floor 但是我无法将第一个“ str_desc ”更改为“ str_address ”。 回答1 您的awk提取代码中几乎拥有完整的解决方案: awk '/str_city/{f

2022-07-11 09:54:14    分类:技术分享    bash   shell   awk   sed

How do I enter 'y' automatically to apt-get?

问题 我正在尝试使用 shell 脚本自动化服务器设置。 我需要使用apt-get安装一些依赖项,有些需要用户在安装继续之前输入y 。 我的问题是如何确保 shell 脚本在每次看到类似Do you want to continue [Y/n]?之类的内容时自动插入y ? ? 我试过sudo apt-get install git << 'y' and 'y' | sudo apt-get install git 'y' | sudo apt-get install git但没有结果。 接下来我可以尝试什么? 回答1 只需使用apt-get手册页中描述的-y或--yes标志。 顺便说一句,甚至还有一个选项--force-yes 。 所以你有很多选择。 回答2 yes | sudo apt-get install git yes一遍又一遍地将单词“yes”写入标准输出。 它也可以用来对其他词做同样的事情(即, yes no | sudo apt-get...对标准输入重复“否”)。 回答3 使用yes命令。 像这样: yes | rm *.txt 这将删除任何文件, yes命令意味着您不必回答查询。 在你的情况下, yes | sudo apt-get install git 这是使用管道功能将“是”响应通过管道传输到标准输入中。

2022-07-11 09:39:15    分类:技术分享    shell   apt   apt-get

"cmd: command not found" from "start" command (open directory in Windows Explorer) in git bash?

问题 回答1 即使没有必要,请尝试以下操作: /c/Windows/System32/cmd.exe //c 'start .' start是cmd.exe内部的命令,因此必须使用cmd /c调用它(并且 Git Bash 显然需要加倍/字符。才能被识别为cmd样式的选项前缀字符)。 但是,它有一个 shell 脚本包装器 - /usr/bin/start - 可以为您执行此操作。 在您的情况下,此 shell 脚本意外地抱怨找不到cmd ,即使/c/WINDOWS/system32默认情况下应该在您的$PATH环境变量中 - 请检查该变量并查看它是否在某处被意外修改。 $PATH最初在/etc/profile中定义,但可以在~/.bash_profile中覆盖/修改,例如。 /etc/profile还在评论中包含有用的链接: # Some resources... # Customizing Your Shell: http://www.dsl.org/cookbook/cookbook_5.html#SEC69 # Consistent BackSpace and Delete Configuration: # http://www.ibb.net/~anne/keyboard.html # The Linux Documentation Project: http://www

2022-05-17 02:51:43    分类:技术分享    git   shell   command-line

"command not found" when running shell script

问题 这是我拥有的简单script.sh文件: #!/bin/bash pwd date ls -lg 我使用chmod +x使文件可执行,但是当使用./script.sh运行它时,我得到command not found: pwd command not found: date并且只有ls -lg命令有效。 我有点困惑为什么前两个命令不起作用,因为当我将它们输入命令终端时,它们会以应有的方式工作。 回答1 回答2

2022-05-16 20:58:04    分类:技术分享    bash   shell   unix

calling perl subroutine in shell script

问题 我制作了一个 Perl 模块MyModule.pm ,它有一些子例程getText ,我想在 shell 脚本中调用它们。 我尝试了以下方式,但它给出了错误; SEC_DIR=`perl -MMyModule -e 'getText'`; # line 1 echo $SEC_DIR exit 0 返回错误; Can't locate MyModule.pm in @INC (@INC contains: /usr/lib/perl5/5.10.0/x86_64-linux-thread-multi /usr/lib/perl5/5.10.0 /usr/lib/perl5/site_perl/5.10.0/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.10.0 /usr/lib/perl5/vendor_perl/5.10.0/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.10.0 /usr/lib/perl5/vendor_perl .). BEGIN 失败——编译中止。 PS: .pm 文件和 .sh 位于同一位置。 我尝试过的其他一些选择; 第 1 行: SEC_DIR=`perl -MMyModule -e '&getText'`; SEC

2022-05-16 20:40:08    分类:技术分享    perl   shell   perl-module

How can I implement cd command in my own shell in C? [duplicate]

问题 这个问题在这里已经有了答案: 为什么 cd 命令在我的 shell 程序中不起作用? (3 个回答) 2年前关闭。 这是我的代码,我是一名西班牙学生,我无法正确解释,但是,我需要在我自己的 C 语言 shell 中实现 cd 命令。如果有人可以帮助实现它,则适用于工作班。 当我将 if 条件放在进程上时,cd 不起作用,但是当我将代码放在外面时,我让 cd 工作,但是,当放回 cd 时,不会像 cd 命令通常那样返回到上一个目录。 如果有任何可以纠正失败。 非常感谢。 #include <fcntl.h> #include <stdio.h> #include <errno.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <libgen.h> #include <sys/shm.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> #define TAM 1000 void parseo(char *line, char **argv); int main(void) { char cad[TAM]; char *argv[TAM]; char *gdir; char *dir; char *to

2022-05-16 20:15:06    分类:技术分享    c   shell   fork   cd

How can an OS X application get itself restarted when it crashes

问题 关于如何让程序保持活动状态并在它们崩溃时重新启动它们有很多提示: 通过使用 shell 脚本通过使用启动 但是,它们都有一个共同的限制:它们都需要在要监控的程序之前运行。 不过,就我而言,我有一个不露面的后台应用程序,它必须自行决定是否要在崩溃时重新启动。 因此,我的应用程序将首先启动,并且不能退出成为监控进程的子进程(解释见下文)。 我已经通过编写这样的 plist 文件尝试了launchd解决方案: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>KeepAlive</key> <dict> <key>SuccessfulExit</key> <false/> </dict> <key>Label</key> <string>com.mydomain.myapp.restartAfterCrash</string> <key>ProgramArguments</key> <array> <string>/Applications/MyApp.app/Contents

2022-05-16 19:45:04    分类:技术分享    macos   shell   launchd

How to see what /bin/sh points to

问题 我正在阅读 /bin/sh 和 /bin/bash 之间的差异,并遇到了这个有趣的问题/答案:here 我对在我的标题中提出同样问题的答案发表了评论,他回复了更新的答案: 如何找出 /bin/sh 指向系统上的内容? 复杂之处在于 /bin/sh 可能是符号链接或硬链接。 如果它是符号链接,解决它的可移植方法是: > % file -h /bin/sh > /bin/sh: symbolic link to bash 如果是硬链接,请尝试 > % find -L /bin -samefile /bin/sh > /bin/sh > /bin/bash 我试过这个并且遇到了麻烦,所以我想我会提出一个单独的问题。 我从链接答案中得到的结果: >file -h /bin/sh >/bin/sh: executable (RISC System/6000) or object module >find -L /bin -samefile /bin/sh >find: bad option -samefile 我错过了什么? 我正在运行 AIX: >oslevel -s 7100-03-03-1415 回答1 如果您需要以编程方式测试它们是否相同,您可以使用stat查询/bin/sh的inode并与/bin/bash的inode进行比较。 if [ $(stat -L -c %i

2022-05-16 18:08:04    分类:技术分享    bash   shell   unix   aix

How to bulk convert some javascript code from import to require?

问题 我需要转换大量 Javascript 文件,将 import 替换为 require。 显然,手工编辑会让人望而生畏,所以我想用一个脚本来自动化它。 如何使用 Unix shell 脚本完成此操作? 以下是我想替换的模式。 该文件的所有其他内容应保持不变。 标记之间的间距可能不一致.. 我在考虑 awk 等,但对语法不太熟悉。 import Foo from 'bar'; -> const Foo = require('bar'); import Foo from "bar"; -> const Foo = require("bar"); import {Foo} from "bar"; -> const {Foo} = require("bar"); import {Foo, Bar, baz as Baz} from 'bar' -> const {Foo, Bar, baz as Baz} = require('bar'); 回答1 sed -E 's~const (.*) = require\((.*)\);~import \* as \1 from \2~' 回答2 使用 GNU sed 表示 ERE 的-E和空格/非空格\s / \S简写: $ sed -E 's/import(\s+\S+\s+)from\s+(\S+);/const\1= require(\2

2022-05-16 16:19:05    分类:技术分享    javascript   shell   awk