标签: whitespace

当变量包含多个路径时如何处理路径名中的空格

尽管我已经阅读了有关处理路径名中空格的大部分问题,但我还没有找到我的案例,即关于一个变量中的多个路径名。

find 当给出两个基本路径时将需要这个,例如:

pa="/home/user/folder1 /home/user/folder2"
find $pa -name '*xy*' ... 
Run Code Online (Sandbox Code Playgroud)

这将寻找在比赛中 folder1folder2

(请注意,这是一个简化的示例;我非常清楚,在这种特殊情况下,您可以使用-path带有folder*跨越两个文件夹的参数的修饰符。但是,这个问题涵盖了您无法解决该问题的情况,因此很容易因为更高的复杂性。)


现在想象一下folder2中间有一个空格。下面将工作:

pa="/home/user/folder1 /home/user/fol\ der2"
find $pa -name '*xy*' ... 
Run Code Online (Sandbox Code Playgroud)

问题是\,它通常用于表示 shell 中的空格,但当变量内容被双引号括起来时将不起作用。但是,与每个变量一条路径不同(它可能会起作用),以下内容也不起作用:

pa=/home/user/folder1 /home/user/fol\ der2
find $pa -name '*xy*' ... 
Run Code Online (Sandbox Code Playgroud)

$ ./test.sh: line 3: /home/user/fol der2: Is a directory

以下变体也不会:

pa=/home/user/folder1 /home/user/fol\ der2
find "$pa" -name '*xy*' ... 
Run Code Online (Sandbox Code Playgroud)

那么如果多个路径包含在一个变量中,如何正确处理路径中的空格呢?

相关问题:是否有任何可靠的方法来确定空格是一个路径与其后继者(在同一变量内)之间的分隔符,还是属于其中包含的路径之一的空格?

bash find filenames whitespace

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

切换到包含空格的目录

我正在使用安装了 OS X 的 MacBook。

我在终端上试图转到一个目录。所以我在家里,我使用命令ls,有一个VirtualBox VMs目录。

但是当我尝试这样做时,cd VirtualBox VMs它说“没有这样的文件或目录”

为什么?

是因为word中的空格键吗?我怎样才能解决这个问题?

shell bash cd-command filenames whitespace

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

如何在文本文件中显示尾随空格?

我希望能够打印并查看文本文件中的尾随空格(仅显示,而不是删除)。

我试过用cat -vwhich 假设显示非打印字符,但它没有按预期显示它们(行之间没有视觉差异)。例如

$ printf "foo\nbar \t\n" > file.txt
$ cat -v file.txt 
foo
bar     
Run Code Online (Sandbox Code Playgroud)

通过打印/显示空格,我的意思是一些视觉人类指示,与其他行相比,尾随空格在那里,没有一些特殊字符、颜色(例如使用 显示文件时git diff)或类似的东西。

有没有其他办法?


注意:我使用的是 macOS Sierra,但是我可以访问 GNU 和 BSDcat命令:

$ type -a cat
cat is /usr/local/opt/coreutils/libexec/gnubin/cat
cat is /bin/cat
$ cat --version
cat (GNU coreutils) 8.28
$ /bin/cat --version
/bin/cat: illegal option -- -
usage: cat [-benstuv] [file ...]
Run Code Online (Sandbox Code Playgroud)

command-line osx whitespace cat

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

预期的二元运算符 - 引用 shell 脚本参数的问题

我有一个关于在执行 shell 脚本时如何添加参数的问题。

我有一个简单的脚本可以帮助我阻止 ip 范围:

~/block_ip.sh:

if [ ! $3 ]
then
 echo "usage ~/block_ip.sh (DROP/ACCEPT) '0.0.0.0' 'amsterdam'"
 exit 1
fi

echo "adding $3"
sudo iptables -I INPUT -s $2 -j $1 -m comment --comment "$3"
Run Code Online (Sandbox Code Playgroud)

如果我在没有参数的情况下执行此操作,则输出符合预期:

~$ ./block_ip.sh
usage ~/block_ip.sh (DROP/ACCEPT) '0.0.0.0' 'amsterdam'
Run Code Online (Sandbox Code Playgroud)

然而,空格似乎是“二元运算符预期”意外输出的原因:

~$ ./block_ip.sh DROP '1.0.0.0/8' 'south brisbane qld'
./block_ip.sh: line 1: [: brisbane: binary operator expected
adding south brisbane au
Run Code Online (Sandbox Code Playgroud)

但是尽管有意外的输出,它还是添加了它:

Chain INPUT (policy ACCEPT)
num  target     prot opt source           destination
1    DROP …
Run Code Online (Sandbox Code Playgroud)

bash shell-script whitespace arguments

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

shell for loop with find 文件名包含空格

考虑一个具有典型 Microsoft Windows 文件名的目录:

新建文档.txt
文件
Foo - Copy.doc

我想对每个文件做一些事情,例如:

对于 $(find ${POLLDIR} -type f -mmin +1 -print0) 中的 sendfile
做
  回声 \"${sendfile}\"
  ls -l "${sendfile}"
  等等
  如果成功_以上
  然后
    mv "${sendfile}" "${donedir}/."
  菲
完毕

请注意,我不想只以“${sendfile}”作为参数运行 1 个命令。我需要循环来做错误检查和其他事情(比如在成功时移动“${sendfile}”并在失败时登录)。

什么是从 find 转义/引用文件名的“正确”构造,以便我可以在ls上面的命令中使用它们?如果可能,我想避免将文件名一一存储在临时文件中。

我不认为find -printf '"%p"\n'正如三重奏在对问题[当文件名包含空格时如何使用查找?] 将在for foo in $(...) do构造中工作。

我认为?在这种情况下替换“非法”字符对我有用,但这会非常难看。for 循环最终处理 ${POLLDIR} 中的文件,然后在完成后移动它们,因此“Foo bar.txt”与“Foo-bar.txt”冲突的机会为 0 (-ish)。

到目前为止,我最好的尝试是:

对于 $(find ${POLLDIR} -type f -mmin +1 -print | tr ' ' '?') 中的 …

find shell-script filenames whitespace

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

bash:传递几个包含文件名的空格

在 bash 脚本中,我将 PDF 逐页光栅化为单个文件,最后生成的单个 PNG 再次合并到 PDF 中,如下所示:

\n\n
convert -monitor /path/to/1.png /path/to/2.png /path/to/3.png ... output.pdf\n
Run Code Online (Sandbox Code Playgroud)\n\n

脚本仍然存在的唯一问题是无法正确处理带有空格的文件。以下是我尝试过的一些事情:

\n\n
newfile=$(sed -r -e \'s| |\\\\ |g\' <<< "$tmppath$curr.png")\necho "DEBUG: newfiles : $newfiles"\nfilearray[$curr-1]="$newfiles"\necho "DEBUG: filearray: ${filearray[*]}"\n
Run Code Online (Sandbox Code Playgroud)\n\n

这产生(每页/文件):

\n\n
DEBUG: newfiles : /tmp/pngpdf/file\\ with\\ spaces/1.png\nDEBUG: filearray: /tmp/pngpdf/file\\ with\\ spaces/1.png\n
Run Code Online (Sandbox Code Playgroud)\n\n

后来,我有两条调试消息

\n\n
echo "DEBUG: filearray: ${filearray[*]}"\necho "DEBUG:            ${filearray[0]}, ${filearray[1]}, ${filearray[2]}, ..."\n
Run Code Online (Sandbox Code Playgroud)\n\n

查看filearray多个文件/页面的外观:

\n\n
DEBUG: filearray: /tmp/pngpdf/file\\ with\\ spaces/1.png /tmp/pngpdf/file\\ with\\ spaces/2.png /tmp/pngpdf/file\\ with\\ spaces/3.png /tmp/pngpdf/file\\ with\\ spaces/4.png /tmp/pngpdf/file\\ …
Run Code Online (Sandbox Code Playgroud)

bash path whitespace escape-characters

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

将路径和文件名从 bash 脚本传递给程序

我使用了一个名为 mp3wrap 的实用程序,它将多个 mp3 合并为一个。假设我有一个目录“album 1”,其中包含三个文件“track 1.mp3”、“track 2.mp3”和“track 3.mp3”。我将运行以下命令:

mp3wrap album\ 1.mp3 album\ 1/*.mp3
Run Code Online (Sandbox Code Playgroud)

这会将“album 1”目录(第二个参数)中的所有三首曲目合并到一个新文件“album 1.mp3”(第一个参数)中。

我有一堆这样的目录,“专辑 2”,“专辑 3”等等,我想写一个脚本来自动化这个过程。我试过这个:

for i in album*
do
  mp3wrap $i.mp3 $i/*.mp3
done  
Run Code Online (Sandbox Code Playgroud)

但我得到了错误

1.mp3: No such file or directory
Run Code Online (Sandbox Code Playgroud)

似乎我的脚本将 $i 扩展为“album 1.mp3”,它作为两个单独的参数传递。经过一些搜索和阅读,我最终得到了这个:

for i in album*
do
  mp3wrap "${i}.mp3" "${i}/*.mp3"
done  
Run Code Online (Sandbox Code Playgroud)

现在我没有收到错误消息,而是从 mp3wrap 程序中获得了“使用”页面。很明显,它接收参数的方式与我从命令行运行命令时的方式不同,而且我不知道如何检查 bash 脚本执行时实际命令行的样子。

我究竟做错了什么?任何帮助表示赞赏!

bash wildcards whitespace variable-substitution

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

将前导空格与 sed 匹配的正确方法(所有这些)?

如何将前导空格与sed(所有这些)匹配?我不是在谈论前导标签,而只是在前导空格上。

从我在 Nano 中做的一个小测试来看,这似乎是正确的:

sed "s/^ //g"
Run Code Online (Sandbox Code Playgroud)

你觉得这个方法有什么问题吗?


注意:“全部”是指文档中的所有前导空格,以防有 2 个或更多,而不仅仅是一个。

sed regular-expression whitespace

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

sed 可能的空白匹配

我必须修改参数文件中的一些参数,可能如下所示:

MY_VAR=YES
Run Code Online (Sandbox Code Playgroud)

我想使用`sed并想出了这个:

sed -i 's/MY_VAR=[A-Z]*/MY_VAR=NO/' sed.txt这似乎有效,现在我也希望它匹配,如果文件看起来像

MY_VAR = YES
Run Code Online (Sandbox Code Playgroud)

或任何其他空白格式,我该怎么做?我尝试过sed -i 's/MY_VAR\s=\s[A-Z]*/MY_VAR=NO/' sed.txt,但没有成功。我该如何正确地做到这一点?

sed regular-expression whitespace

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

Bash 脚本:包含空格字符的数组元素

我正在开始使用 bash 脚本。我正在处理包含空格字符的数组元素。在下面的代码中,第三个数组元素是“Accessory Engine”。我尝试使用\符号设置空格字符,但这无济于事。

在较大的例程中(此处未包含),我使用数组元素通过命令行工具自动执行某些操作。这些命令行工具将接受“附件引擎”作为输入。

#!/bin/bash
components="Persistence Instrument Accessory\Engine"
for i in $components; do
  echo ${i}
done
Run Code Online (Sandbox Code Playgroud)

现在这段代码的输出是:

  Persistence
  Instrument
  Accessory\Engine
Run Code Online (Sandbox Code Playgroud)

但我希望它是:

  Persistence
  Instrument
  Accessory Engine
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

bash array shell-script whitespace

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