for i in $(xrandr); do echo "$i" ; donefor i in "$(xrandr)"; do echo "$i"; donefor i in "$(xrandr)"; do echo $i; done我明白为什么 1 与 2 不同。但为什么 3 的输出与 2 不同?请解释输出。引号如何在换行符上工作?
我有一个file包含名称列表的列表。IE:
Long Name One (001)
Long Name Two (201)
Long Name Three (123)
...
Run Code Online (Sandbox Code Playgroud)
带有空格和一些特殊字符。我想用这些名称创建目录,即:
cat file | xargs -l1 mkdir
Run Code Online (Sandbox Code Playgroud)
它使各个目录以空格分隔,即Long, Name, One, Two, Three, 而不是 Long Name One (001), Long Name Two (201), Long Name Three (123)。
我怎样才能做到这一点?
鉴于这些文件名:
$ ls -1
file
file name
otherfile
Run Code Online (Sandbox Code Playgroud)
bash 本身对于嵌入的空白完全没问题:
$ for file in *; do echo "$file"; done
file
file name
otherfile
$ select file in *; do echo "$file"; done
1) file
2) file name
3) otherfile
#?
Run Code Online (Sandbox Code Playgroud)
但是,有时我可能不想处理每个文件,甚至不希望使用严格的 in $PWD,这是find进来的地方。名义上也处理空格:
$ find -type f -name file\*
./file
./file name
./directory/file
./directory/file name
Run Code Online (Sandbox Code Playgroud)
我正在尝试编造这个scriptlet的 whispace-safe 版本,它将获取输出find并将其呈现到select:
$ select file in $(find -type f -name file); do echo $file; break; …Run Code Online (Sandbox Code Playgroud) 我正在学习 shell 脚本,为此我正在使用 HackerRank。sed在同一站点上有一个与此相关的问题:“Sed”命令 #1:
对于给定的输入文件的每行,变换字“的”与“这个”的第一次出现。搜索和转换应该严格区分大小写。
首先我尝试过,
sed 's/the/this/'
Run Code Online (Sandbox Code Playgroud)
但在那个示例测试用例中失败了。然后我试过了
sed 's/the /this /'
Run Code Online (Sandbox Code Playgroud)
它奏效了。那么,问题来了,这些空格产生了什么不同?我在这里错过了什么吗?
这个问题的答案与sed的去除尾随空白已大部分的答案,但我想
sed -i 's/[ \t]*$//' $1
Run Code Online (Sandbox Code Playgroud)
能够将任意数量的文件参数作为命令行上的 shell 脚本,包括 glob 参数。即假设脚本被称为strip_trailing_whitespace. 然后我希望能够做到这两点
strip_trailing_whitespace foo.cc bar.cc
Run Code Online (Sandbox Code Playgroud)
和
strip_trailing_whitespace *.cc *.hh
Run Code Online (Sandbox Code Playgroud)
从表单的所有文件中去除尾随空格*.cc和*.hh. 不基于上面引用的答案的论点也可以。
这是我偶尔在这里和那里遇到的这种烦人的行为:当您在控制台中用鼠标选择文本(即复制它)时,粘贴它,然后意识到每行末尾都有额外的空格。那是,
line 1
line 2
Run Code Online (Sandbox Code Playgroud)
代替
line 1
line 2
Run Code Online (Sandbox Code Playgroud)
所以,不仅仅是每一行末尾的一个空格。
我无法可靠地重现该问题,也找不到答案。我相信对于某些软件,它会在一段时间后才会显现出来。
但我只注意到,当我打开在同一文件中vim,从控制台第一个路口右转,然后tmux,它的作品了很好的前一种情况。并且不在后者中。考虑到TERM=xterm-256color控制台,并TERM=screen-256color在tmux我的猜想是,它与终端不这样做正确,或不使应用程序正确地去做的事情。我猜是一个相当模糊的猜想。所以,第一个问题是,“究竟是什么导致了它?”
另一个是,“我该怎么做?” 最坏的情况是文件位于远程位置。我以前在本地复制它,gedit最近用它打开。现在我应该可以选择在新控制台中打开它(因为我主要在tmux会话中工作),然后从那里复制。这可以做得更简单吗?
当我vim从tmuxwith运行时TERM=xterm-256color vim,它的行为很奇怪。就像没有绘制没有文字的背景一样。而且对我来说改变TERM变量似乎不太好(让软件认为它正在处理其他终端)。
编辑本地文件时,我通常做:!gedit %.
我有一个包含一些 HTML 和一些文本的文件,我只想使用文本行。
我在玩弄grep,试图找到一种方法来排除以 HTML 标记开头的行,甚至是在标记前包含空格的行。
不知何故这对我有用,但我认为它不应该:
grep '^\<' file.htm
它只是向我显示没有 html 的行。你能解释一下为什么吗?我想我需要grep -v一些.*地方来完成这项工作。
作为一名主要的 Java 程序员,我发现 bash if-then构造非常令人困惑,尤其是在空格方面。谁能解释为什么第一个有效,而第二个或第三个无效?
#works
if [ -n $1 ]; then echo "parameterized"; fi
#output: ./links: Zeile 1: [-n: Kommando nicht gefunden.
if [-n $1 ]; then echo "parameterized"; fi
#output: ./links: Zeile 1: [: Fehlende `]'
if [ -n $1]; then echo "parameterized"; fi
Run Code Online (Sandbox Code Playgroud) 我创建了一个带有制表符分隔字段的文件。
echo foo$'\t'bar$'\t'baz$'\n'foo$'\t'bar$'\t'baz > input
Run Code Online (Sandbox Code Playgroud)
我有以下脚本命名 zsh.sh
#!/usr/bin/env zsh
while read line; do
<<<$line cut -f 2
done < "$1"
Run Code Online (Sandbox Code Playgroud)
我测试一下。
$ ./zsh.sh input
bar
bar
Run Code Online (Sandbox Code Playgroud)
这工作正常。但是,当我将第一行更改为调用时bash,它失败了。
$ ./bash.sh input
foo bar baz
foo bar baz
Run Code Online (Sandbox Code Playgroud)
为什么这会失败并bash与 一起使用zsh?
env产生相同的行为。echo而不是使用 here-string<<<$line也会产生相同的行为。即echo $line | cut -f 2。awk而不是cut 适用于两个外壳。即<<<$line awk '{print $2}'。我正在尝试打印由 TAB 分隔的两个字符串。我试过了:
echo -e 'foo\tbar'
printf '%s\t%s\n' foo bar
Run Code Online (Sandbox Code Playgroud)
他们都打印:
foo bar
Run Code Online (Sandbox Code Playgroud)
两者之间的空格实际上是 5 个空格(根据在 Putty 中用鼠标选择输出)。
我也尝试过使用 CTRL+V 并在键入命令时按 TAB,结果相同。
强制将选项卡打印为选项卡的正确方法是什么,以便我可以选择输出并将其复制到其他地方,使用选项卡?
第二个问题:为什么 bash 将制表符扩展为空格?
更新:显然,这是 Putty 的问题:https : //superuser.com/questions/656838/how-to-make-putty-display-tabs-within-a-file-instead-of-changed-them-to -空格