我有一个目录A,其中包含一些.xml扩展名的文件,我需要在其上运行搜索和替换.在A中有几个符号链接(也带有.xml扩展名)链接到A中的某些文件.我尝试运行sed -i 's/search_regexp/replacement_string/' *.xml但是当它遇到符号链接时它失败了
sed: ck_follow_symlink: couldn't lstat file.xml: No such file or directory
Run Code Online (Sandbox Code Playgroud)
一个解决方案是循环我实际想要修改的文件并在每个文件上调用sed,但有没有办法告诉sed忽略符号链接?或者只是按照它们修改链接文件?
以下行删除变量前的前导文本 $PRECEDING
temp2=${content#$PRECEDING}
Run Code Online (Sandbox Code Playgroud)
但现在我希望它$PRECEDING不区分大小写.这适用sed的I标志.但我无法弄清楚整个cmd.
我正在寻找一种方法来为具有负模式的特定模式grep文件.我有一个日志文件巫婆报告单位版本,我想看看是否有一个单位巫婆报告版本,然后26.
我能得到的最接近的是:
cat my.log | grep -i -e"version = 0x [^ 2] [^ 6]"
上面的返回行包含"version = 0x13"但不返回包含"version = 0x23"的行
有没有办法告诉grep这样做?
谢谢.
我有一个创建文件的脚本,有时他们最初有2个破折号,有没有办法删除它们mv不起作用
这是我得到的错误
$ ls
--1355509766.jpg
$ rm --1355509766.jpg
rm: illegal option -- -
usage: rm [-f | -i] [-dPRrvW] file ...
unlink file
$ rm "--1355509766.jpg"
rm: illegal option -- -
usage: rm [-f | -i] [-dPRrvW] file ...
unlink file
Run Code Online (Sandbox Code Playgroud) 我想创建自己的个人日志文件,不仅可以在我登录和退出时记录,还可以在我锁定/解锁屏幕时记录.有点类似/ var/log/wtmp类固醇.
为此,我决定在登录到后台运行的Ubuntu时运行脚本,直到我退出.我这样做的计划是将脚本添加到脚本中.bashrc,./startlogging.sh &并使用脚本trap来捕获信号.这很好,除了.bashrc每次打开一个新终端时运行,这不是我想要的记录器.
有没有办法告诉Bash当前登录是gnome登录?或者,有什么.gnomerc我可以用来运行我的脚本?
编辑:这是我的脚本:
编辑2:删除了脚本,因为它与问题无关.我将重新提出我的另一个问题,而不是重新利用这个问题.
我正在寻找一种递归遍历目录以查找特定文件的方法,然后停止搜索并将文件名路径传递给awk函数或类似的东西.我之前问了一个类似的问题,但是在我以外的机器上进行测试后发现locate命令不起作用,因为不是每个人都在他们的系统上使用它.
我与locate一起使用的代码:
dir="/path/to/destination/";
mkdir "$dir";
locate -l 1 target_file.txt | \
awk -v dir="$dir" '{printf "cp \"%s\" \"%s\"\n", $1, dir}' | \
sh
Run Code Online (Sandbox Code Playgroud) 我有以下字符串/path/to/my-jar-1.0.jar,我正在尝试为其编写 bash 正则表达式以提取my-jar.
现在我相信以下正则表达式会起作用:([^\/]*?)-\d但我不知道如何让 bash 运行它。
以下:echo '/path/to/my-jar-1.0.jar' | grep -Po '([^\/]*?)-\d'捕获my-jar-1
从 Ubuntu 14.04 迁移到 16.04 时,我注意到我的几个 Bash 脚本由于缺少导出的函数而失败。我想知道这是否与Shellshock 错误的修复有关,即使我只是简单export -f的函数,而不是依赖 Bash 内部函数表示。失败不会发生在直接的 Bash 子 shell 中,只有在两者之间有另一个进程时才会发生。例如,Bash 调用 awk / Perl / Vim 调用另一个 Bash。下面是一个 Perl 的例子:
$ foo() { echo "foobar"; }
$ export -f foo
$ export -f; foo
foo ()
{
echo "foobar"
}
declare -fx foo
foobar
$ bash -c "export -f; foo"
foo ()
{
echo "foobar"
}
declare -fx foo
foobar
$ perl -e 'system("bash -c \"export -f; foo\"")'
foo …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种将 Win32 路径转换为 POSIX 路径的方法,最好使用 Win32 工具。
背景:
最新的 Windows 10 Insider Build 引入了适用于 Linux 的 Windows 子系统 (WSL),包括bash由 Ubuntu 背后的公司 Canonical 提供的本机。他们的实现在 Windows 上的 Ubuntu 上bash使用了相当复杂的Bash名称,我将bash.exe在下文中引用它。
访问Windows路径的等效C:\Users\me\Desktop于bash.exeIS /mnt/c/Users/me/Desktop。
我正在尝试bash.exe从 Windows 命令提示符(例如bash -c ls /mnt/me/Desktop)传递路径。由于这需要我传递 POSIX 路径,我想知道 Microsoft 是否提供任何工具以编程方式将 Win32 路径转换为 POSIX 路径(就像cygpath在 Cygwin 中所做的那样。)
除非 Windows 附带任何翻译工具,否则我对确定路径的替代方法持开放态度,例如使用 Node 或 Python。
我有一个带有方法的shell脚本:
start(){
echo "Hello world"
}
stop(){
ps -ef|grep script.sh|grep -v grep|xargs kill
}
while [ "$1" != "" ]; do
case "$1" in
start)
start
;;
stop)
stop
;;
*)
echo $"Usage: $0 {start|stop}"
exit 1
esac
shift
done
Run Code Online (Sandbox Code Playgroud)
我正在使用以下命令运行此脚本:./script.sh start调用 start 方法。现在,我想检查此进程是否已在运行,如果已在运行则退出。我在网上尝试了一些解决方案,但没有任何效果。有人请帮忙。我尝试过的解决方案是:
if [ -f /var/tmp/script.lock ]; then
echo "Already running. Exiting."
exit 1
else
touch /var/tmp/script.lock
fi
<main script code>
#some code
rm /var/tmp/script.lock
Run Code Online (Sandbox Code Playgroud)
另一种是:
PID=$(ps -ef | grep script.sh|grep -v grep)
if [ -z …Run Code Online (Sandbox Code Playgroud)