在Bash中,如何在文件的每一行之后添加字符串?


Answers:


188

如果您sed允许通过-i参数进行就地编辑:

sed -e 's/$/string after each line/' -i filename

如果没有,则必须制作一个临时文件:

typeset TMP_FILE=$( mktemp )

touch "${TMP_FILE}"
cp -p filename "${TMP_FILE}"
sed -e 's/$/string after each line/' "${TMP_FILE}" > filename

为什么touch是临时文件?并且我将以该sed命令的成功为条件,cp否则原始命令可能会丢失。
暂停,直到另行通知。

我触摸了文件以快速保留临时名称。可能不需要这样做。我认为您将sed命令作为cp成功的条件是正确的。为什么不编辑代码进行修复。我不会介意的!您的汤姆
汤姆·德吉斯

在行添加字符串呢?
Oxwivi 2012年

10
@Oxwivi:sed -e 's/^/string after each line/' -i filename $表示行尾。^表示行首。
汤姆·德吉西

如果我将管道输送到sed中,sed 's/^/string after each line/'则执行我期望的操作(在每行之前),但sed 's/^/string after each line/'不会(将整个行替换为我的附加字符串)。是什么赋予了?有什么想法@TomDeGisi吗?
phil13年

17

我更喜欢使用awk。如果只有一列,请使用$0,否则将其替换为最后一列。

单程,

awk '{print $0, "string to append after each line"}' file > new_file

或这个,

awk '$0=$0"string to append after each line"' file > new_file

1
另外,要附加行号(如我的情况),可以使用NR变量:awk '{print $0, NR}'
andrybak

2
@optimus我尝试了您的方法,但是给它们增加了空间,关于如何删除它们的任何想法?
阿迪尔·萨朱

@AdilSaju sed 's/ //g'这可以满足我的要求,但是它将删除每行中的空间,这就是g行中任何地方的选择。
Eklavyaa

@AdilSaju,请添加详细信息。最好问一个新问题。
擎天柱

@AdilSaju awk删除, 类似{print $0"string to append after each line"}
Culip

8

如果有的话,lam(层压)实用程序可以做到这一点,例如:

$ lam filename -s "string after each line"

4
  1. POSIX外壳sponge

    suffix=foobar
    while read l ; do printf '%s\n' "$l" "${suffix}" ; done < file | 
    sponge file
  2. xargsprintf

    suffix=foobar
    xargs -L 1 printf "%s${suffix}\n" < file | sponge file
  3. 使用join

    suffix=foobar
    join file file -e "${suffix}" -o 1.1,2.99999 | sponge file
  4. 使用shell工具pasteyesheadwc

    suffix=foobar
    paste file <(yes "${suffix}" | head -$(wc -l < file) ) | sponge file

    请注意,在之前paste插入Tab字符$suffix

当然sponge可以用一个临时文件代替,之后mv用原始文件名代替其他一些答案...


1
sed除非资源非常有限,否则这些都不是最可取的。
AGC

我喜欢非sed解决方案。sed如此简单的工作是不需要的。
布鲁斯

1

我更喜欢echo。使用纯bash:

cat file | while read line; do echo ${line}$string; done

-9

Sed有点丑陋,您可以像这样优雅地进行操作:

hendry@i7 tmp$ cat foo 
bar
candy
car
hendry@i7 tmp$ for i in `cat foo`; do echo ${i}bar; done
barbar
candybar
carbar

2
对于行数超过Shell最大参数限制的文件失败。尝试:cat foo | 同时阅读; 回显$ {a} bar; 完成或类似的事情;在大多数情况下,它是一个合适的替代品。
Alex

1
对于其中带有空格的行,它也将失败。
暂停,直到另行通知。

1
嗯,不,这不会使丹尼斯失败。外壳程序的最大参数限制?key,你在垂头丧气。
亨德利2010年

是的,它的确是这样:$ cat foo foo bar baz alex @ armitage:〜$ for i in cat foo; 回显$ {i} bar; 做过foobar barbar bazbar,但是经过一些测试,我的推理可能错了,但Dennis是对的
Alex

3
@hendry是的,对于包含空格的行,这确实会失败,例如echo "foo bar" | (for i in `cat`; do echo ${i}bar; done)即使输入为1行也打印2行foo bar(并且cat从stdin而不是文件中读取内容对此没有任何影响)。
海德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.