如何在输入上用换行符替换空格:

/path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5等...

要获得以下内容:

/path/to/file
/path/to/file2
/path/to/file3
/path/to/file4
/path/to/file5


注意

我正在发布此问题以帮助其他用户,在我开始键入此问题之前,要在UNIX SE上找到有用的答案并不容易。之后,我发现了以下内容:

相关问题

如何找到并替换新行?

评论

总投票数+922的问题:如何在Bash中的分隔符上拆分字符串?

ls / path / to / | xargs回声| sed's / \ s \ + / \ n / g'

#1 楼

使用tr命令

echo "/path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5"\
| tr " " "\n"


位于http://www.unix.com/shell-programming-scripting/67831-replace-space-new-line.html上

评论


tr是我的第一个想法,尽管有很多方法可以做到!不过,这几乎就是tr的用途!

–Rob
2013年12月17日15:43

+1,但请注意:如果文件名本身包含空格,那将不起作用

– Bonsi Scott
2013年12月17日16:10

#2 楼

在这种情况下,我将使用printf:

printf '%s\n' /path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5


如果其中一个路径内有空格,则可以引用该文件路径以防止其被分割。空格:

printf '%s\n' /path/to/file '/path/to/file with spaces' /path/to/another/file


一般而言,要转换文本,tr是最好的选择,如现有答案所述。

评论


未来的简短说明:感谢您发布此解决方案,与使用“ echo”相比,它对我而言非常可靠。

–列史密斯
15年4月30日在21:48

#3 楼

务实,使用sed !!

sed 's/\s\+/\n/g' file


上面说的是用换行符(\ n)替换一个或多个空格字符(\ s +)

/>或多或少:

'substitute /one space or more/ for /newline/ globally'


评论


用替代替换更改,这实际上是s的代表!

–Rob
2013年12月17日16:37

@Rob谢谢,记住您可以编辑其他答案。

–MGP
2013年12月17日下午16:42

如果文本之间有多个空格,则会出现空白行。您需要在\ s后面添加一个“ +”号,以表示您要匹配至少一个与正好一个空格相对应的空格。即。 sed's / \ s + / \ n / g'

–user14755
2013年12月17日20:43

它对带空格的'/ path / to / file是否有效

– Timo
1月2日20:12

@Timo不,每个空格都将转换为一个换行符,您可以使用`/`作为断点,然后再次注入/,但是在某些情况下(例如/ path /在斜杠前使用空格)会出现问题,然后更多。

–MGP
1月3日14:50



#4 楼

假设您有一个用空格作为分隔符的字符串:

newline_separated=${space_separated// /$'\n'}


但是您可能会问错一个问题。 (不一定是这样,例如,这可能会在makefile中出现。)用空格分隔的文件名列表实际上并不起作用:如果其中一个文件名包含空格,该怎么办?

如果程序接收文件名作为参数,不要用空格连接它们。使用"$@"逐一访问它们。尽管echo "$@"打印参数时要在中间插入空格,但这是由于echo:它打印参数时要使用空格作为分隔符。 somecommand "$@"将文件名作为单独的参数传递给命令。如果要在单独的行上打印参数,可以使用

printf '%s\n' "$@"


如果确实有用空格分隔的文件名,并且想要将它们放在数组中以对它们进行处理,可以使用未加引号的变量扩展来拆分IFS上字符的值(您需要使用set -f禁用通配符扩展,否则将在值中扩展glob模式):

space_separated_list='/path/to/file1 /path/to/file2 /path/to/file3'
IFS=' '; set -f
eval "array=($space_separated_list)"
for x in "${array[@]}"; do …


您可以将其封装在一个函数中,该函数可以在完成后恢复-f设置和IFS的值:

split_list () {
  local IFS=' ' flags='+f'
  if [[ $- = *f* ]]; then flags=; fi
  set -f
  eval "=()"
  set $flags
}
split_list array '/path/to/file1 /path/to/file2 /path/to/file3'
for x in "${array[@]}"; do …


评论


更改对此的正确答案。我认为研究我如何到达以空格分隔的列表并以另一种方式检索该信息是更正确的。如果您评论一下您的片段,告诉我们像本地var IFS或$-= f条件这样的事情,对像我这样的学习者来说,这很酷。几次使用bash的人都不知道这种事情。

–laconbass
2014年12月11日在22:01

@laconbass我添加了简短的解释。如果需要所有详细信息,请在bash手册中查找set -f和IFS。另请参见unix.stackexchange.com/questions/16192/…

–吉尔斯'所以-不再是邪恶的'
2014年12月11日在22:26

@Guilles简短的解释对我来说足够了,我认为对其他许多人来说也是如此。为你的时间

–laconbass
2014年12月12日下午2:31

在本地设置IFS无效

–伊莱兰·马尔卡(Eliran Malka)
17年4月20日在23:35

@EliranMalka我不知道你是什么意思。如果脚本的行为不符合您的预期,则可以在此处提出问题。

–吉尔斯'所以-不再是邪恶的'
17年4月21日在8:32

#5 楼

作为来自@laconbass的tr的替代方法,在这种情况下,您还可以使用xargs

echo "/path/to/file /path/to/file2 /path/to/file3 /path/to/file4  /path/to/file5"\
| xargs -n1


优点是它甚至可以在多个空格下工作,而tr不能使用t。

#6 楼

这是我的操作方法:

echo "/path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5" | sed 's/ /\
'/g


注意在sed命令中反斜杠后使用Enter键。

评论


在tr上有哪些利弊?

–laconbass
2013年12月17日15:33

您的舒适度:-)我想您可以使用sed做更多的事情,因为它是编辑器,而不是简单地翻译字符。

– unxnut
2013年12月17日15:38

sed可以做更多的事情,但这完全是矫kill过正。 tr是完成此工作的正确工具,但是稍后会对sed和正则表达式的知识派上用场!

–Rob
2013年12月17日15:44

#7 楼

另一种方法,假设该行位于名为line的变量中:

for path in $line;do echo $path;done


这利用了以下事实:Bash默认在空白处拆分其参数,并且echo追加一个默认情况下将换行符输入其输入。

评论


在发布此问题之前,我在ubuntu系统上尝试了此操作,但无法使其正常工作。

–laconbass
2013年12月17日下午16:38

#8 楼

echo word1 word2 ... | sed -e 'y/ /\n/;P;D'


是将单行分隔的单词转换为换行符的另一种方法。

#9 楼

以下脚本易于理解且易于使用。

cat filename | tr ' ' '\n' | tee filename


评论


您的答案的本质(tr)与接受的答案相同。除此以外,您的答案还有以下问题:a)命令没有缩进4个空格(-> markdown布局)b)使用cat是没有用的(可以用
–maxschlepzig
2015年9月3日下午6:26

除了maxschlepzig的正确分析之外,这不是脚本,而是一堆带有硬编码名称的连接命令(因为脚本希望有一个标头,用于指定要使用的shell,并使用两个参数来指定in和输出)。除此之外,我家中有三分之二的人很难理解。也许这不是代表性的,但请记住,您自己理解的东西(在这种情况下您认为自己理解的东西)看起来总是很容易的。

–安东
2015年9月3日下午6:34